{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e53b5877-1fd4-43a6-883b-fddcd470d683",
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b8ed1474-36fc-4f1a-abe0-90a35129564a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from os.path import exists\n",
    "from torch import nn\n",
    "import torchvision\n",
    "import copy\n",
    "import PIL.Image as Image\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "from jsputils import paths, nsdorg, plotting, encoding, nnutils, selectivity, validation, lesioning\n",
    "from fastprogress import progress_bar\n",
    "from IPython.core.debugger import set_trace"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "36d6a566-c56f-498c-8547-638b5d7addb6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1584"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# vpnl-floc\n",
    "# classic-categ\n",
    "# mc8-lummatched\n",
    "# mc8-shined\n",
    "\n",
    "class ImageSet:\n",
    "    def __init__(self, image_set_name, transforms = None):\n",
    "        \n",
    "        self.image_set_name = image_set_name\n",
    "        self.image_folder = f'{paths.image_set_dir()}/{self.image_set_name}'\n",
    "        self.transforms = transforms\n",
    "        \n",
    "        if image_set_name == 'vpnl-floc':\n",
    "            self.categ_nimg = 144\n",
    "            self.floc_subdirs = np.array(['adult','body','car','child','corridor','house',\n",
    "                                                       'instrument','limb','number','scrambled','word'])\n",
    "            self.floc_domains = np.array(['faces','bodies','objects','scenes','characters','scrambled'])\n",
    "            self.domain_colors = np.array(['red','dodgerblue','orange','limegreen','blueviolet','lightgray'])\n",
    "            self.subdir_domain_ref = np.array([0,1,2,0,3,3,2,1,4,5,4])\n",
    "            \n",
    "        elif image_set_name == 'classic-categ':\n",
    "            self.categ_nimg = 80\n",
    "            self.floc_subdirs = np.array(['1-Faces','2-Bodies','3-Scenes','4-Words',\n",
    "                                          '5-Objects','6-ScrambledObjects','7-ScrambledWords'])\n",
    "            self.floc_domains = np.array(['faces','bodies','objects','scenes','characters','scrambled'])\n",
    "            self.domain_colors = np.array(['red','dodgerblue','orange','limegreen','blueviolet','lightgray'])\n",
    "            self.subdir_domain_ref = np.array([0,1,2,3,4,5,5])\n",
    "            \n",
    "        for subdir in os.listdir(self.image_folder):\n",
    "            if os.path.isdir(subdir):\n",
    "                assert(len(os.listdir(f'{self.image_folder}/{subdir}')) == self.categ_nimg)\n",
    "            \n",
    "        self.img_domain_indices = np.repeat(self.subdir_domain_ref, self.categ_nimg)\n",
    "        \n",
    "        self.load_images()\n",
    "            \n",
    "    def load_images(self):\n",
    "        # Load images from the folder using torchvision and apply transforms\n",
    "        self.images = torchvision.datasets.ImageFolder(self.image_folder, transform = self.transforms)\n",
    "    \n",
    "    def plot_domain_labels(self):\n",
    "        plt.figure()\n",
    "        plt.plot(self.img_domain_indices)\n",
    "        plt.yticks(np.arange(len(self.floc_domains)),self.floc_domains);\n",
    "        plt.xlabel('floc img indices')\n",
    "        plt.title(f'domain of each floc image: {self.image_set_name}');\n",
    "        \n",
    "        \n",
    "test = ImageSet('vpnl-floc')\n",
    "len(test.images)\n",
    "#test.load_images()\n",
    "#test.images[0][0]\n",
    "#test.plot_domain_labels()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c21b9eaf-aa24-4506-9897-457933d103e3",
   "metadata": {},
   "outputs": [],
   "source": [
    "class DataLoaderFFCV:\n",
    "    def __init__(self, partition, device = 'cuda:0', batch_size = 512, num_workers = 64):\n",
    "        self.partition = partition\n",
    "        self.device = device\n",
    "        self.batch_size = batch_size\n",
    "        self.num_workers = num_workers\n",
    "           \n",
    "        if self.partition == 'train':\n",
    "            pass\n",
    "        elif self.partition == 'val':\n",
    "            self.data_loader = validation.create_val_loader(paths.ffcv_imagenet1k_valset(), \n",
    "                                                            self.device,\n",
    "                                                            self.num_workers, \n",
    "                                                            self.batch_size)\n",
    "\n",
    "\n",
    "#     def extract_activations(self, layer_name):\n",
    "#         # Extract activations from the specified layer of the model for the given image set\n",
    "#         pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a4908a88-d98b-422f-b82a-c492b3f9e397",
   "metadata": {},
   "outputs": [],
   "source": [
    "class DNNModel:\n",
    "    def __init__(self, model_name):\n",
    "                         \n",
    "        self.model, self.transforms, self.state_dict, self.is_categ_supervised, self.model_name = nnutils.load_model(model_name)\n",
    "                 \n",
    "        self.layer_names, self.layer_dims = nnutils.get_layer_names_and_dims(self.model)\n",
    "        self.formatted_layer_names = None\n",
    "\n",
    "    def find_selective_units(self, localizer_image_set, FDR_p = 0.05, overwrite = False, verbose = False):\n",
    "        \n",
    "        # Define the indices of category-selective units using localizer images\n",
    "        floc_imageset = ImageSet(localizer_image_set, transforms = self.transforms)\n",
    "        \n",
    "        self.selective_units = selectivity.run_dnn_localizer_procedure(self, floc_imageset, FDR_p, overwrite, verbose)\n",
    "        \n",
    "    def get_imagenet_accs(self, topk = 5): \n",
    "        \n",
    "        ValLoader = DataLoaderFFCV('val')\n",
    "        \n",
    "        self.imagenet_accs = validation.get_imagenet_class_accuracies(copy.deepcopy(self.model).half().to(ValLoader.device),\n",
    "                                                                      ValLoader.data_loader,\n",
    "                                                                      ValLoader.device, topk = topk)\n",
    "            \n",
    "            \n",
    "    def train_linear_probe(self):\n",
    "        # Train a linear ImageNet probe for self-supervised models\n",
    "        pass\n",
    "\n",
    "    def assess_lesioning_impact(self):\n",
    "        # Assess the impact of lesioning selective units on the model's ImageNet performance\n",
    "        pass\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b4ca6710-14cc-427d-ae09-d92a3fb61bba",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "DNN = DNNModel('alexnet-dropout-0.5')\n",
    "DNN.find_selective_units('vpnl-floc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "045eed1e-74ae-4d95-8370-9a5f417b24e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "DNN.selective_units['floc_domains']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9b733e9c-886e-4440-8abb-93f4b5d4a88a",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "#DNN.get_selective_unit_val_acts('vpnl-floc')\n",
    "#DNN.find_selective_units('vpnl-floc')\n",
    "\n",
    "DNN.get_imagenet_accs(topk = 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "01389543-f8c7-43e7-92aa-2c889a1e0708",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "51d3f36e-7a67-4d10-8825-f78dad6344b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "class LesionModel(DNNModel):\n",
    "    def __init__(self, DNNModel, device):\n",
    "        \n",
    "        self.model = DNNModel.model\n",
    "        if hasattr(DNNModel,'selective_units'):\n",
    "            self.selective_units = DNNModel.selective_units\n",
    "        self.device = device\n",
    "        \n",
    "        # initialize lesioning model using modules from source network\n",
    "        masks = dict()\n",
    "        masks['apply'] = False\n",
    "        self.model = lesioning.LesionNet(self.model, masks).eval().to(self.device)\n",
    "        \n",
    "        self.layer_dims = lesioning.get_layer_dims(self.model, self.device)\n",
    "    \n",
    "        \n",
    "    def apply_randomized_lesions(self, lsn_layer, p = 0.5):\n",
    "        \n",
    "        self.model.masks = lesioning.get_random_lesioning_masks(self.model, \n",
    "                                                          self.layer_dims, \n",
    "                                                          lsn_layer, \n",
    "                                                          self.device, \n",
    "                                                          p)\n",
    "        \n",
    "    def remove_randomized_lesions(self):\n",
    "        masks = dict()\n",
    "        masks['apply'] = False\n",
    "        self.model.masks = masks\n",
    "                \n",
    "    def get_imagenet_accs(self, topk = 5): \n",
    "        \n",
    "        ValLoader = DataLoaderFFCV('val')\n",
    "        \n",
    "        self.imagenet_accs = validation.get_imagenet_class_accuracies(copy.deepcopy(self.model).half().to(ValLoader.device),\n",
    "                                                                      ValLoader.data_loader,\n",
    "                                                                      ValLoader.device, topk = topk)\n",
    "    \n",
    "    def get_selective_unit_acts(self):\n",
    "        \n",
    "        assert(hasattr(self, 'selective_units'))\n",
    "            \n",
    "        ValLoader = DataLoaderFFCV('val')\n",
    "        \n",
    "        print(self.model.layer_names)\n",
    "        \n",
    "        self.selective_unit_acts = validation.get_selective_unit_acts(copy.deepcopy(self.model).half().to(ValLoader.device),\n",
    "                                                                      copy.deepcopy(self.selective_units),\n",
    "                                                                      list(self.selective_units['faces'].keys()),\n",
    "                                                                      ValLoader.data_loader,\n",
    "                                                                      ValLoader.device)\n",
    "        \n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "06801f58-4fa3-484a-9b6e-94d8c882e111",
   "metadata": {},
   "outputs": [],
   "source": [
    "#LSN.selective_units['faces']\n",
    "# torch.cuda.empty_cache()\n",
    "# del LSN\n",
    "# gc.collect()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "99c31618-aa7e-476f-8e85-513199d664a1",
   "metadata": {},
   "outputs": [],
   "source": [
    "#x = torch.ones(1,3,224,224) * 100\n",
    "LSN = LesionModel(DNN, 'cuda:0')\n",
    "LSN.model.return_acts = False\n",
    "LSN.model.masks['apply'] = False\n",
    "#LSN.get_selective_unit_acts()\n",
    "#LSN.apply_randomized_lesions('relu6', p = 0.7)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ad006760-c2f5-413d-b75a-d95589b24e8d",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = list(DNN.selective_units['faces'].keys())\n",
    "b = list(LSN.model.layer_names)\n",
    "\n",
    "print(a,b)\n",
    "print(len(a), len(b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0b95c70f-a1ab-42ce-9904-831ea69d9478",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# layer_mapping = dict()\n",
    "# nnutils.alexnet_layer_str_format(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7075cfce-7f18-4541-99cd-6962b91a41bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "LSN.get_imagenet_accs(topk=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f143ed0c-04f2-46f9-9820-fba256e02244",
   "metadata": {},
   "outputs": [],
   "source": [
    "# LSN.model.return_acts = False\n",
    "# LSN.apply_randomized_lesions('relu6', p = 0.99)\n",
    "LSN.remove_randomized_lesions()\n",
    "\n",
    "# a = LSN.model(x).detach().numpy().squeeze()\n",
    "\n",
    "# plt.plot(a);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c2438911-654a-4da7-8152-2d4f08ee054b",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(np.mean(DNN.imagenet_accs))\n",
    "print(np.mean(LSN.imagenet_accs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1b432450-422e-404f-a54e-b30f93fab82a",
   "metadata": {},
   "outputs": [],
   "source": [
    "class fMRISubject:\n",
    "    def __init__(self, subj, space, beta_version):\n",
    "        self.subj = subj\n",
    "        self.space = space\n",
    "        self.beta_version = beta_version\n",
    "        self.betadir = f'{paths.nsd()}/nsddata_betas/ppdata/{self.subj}/{self.space}/{self.beta_version}'   \n",
    "        self.processed_datadir = f'{paths.brain_region_savedir()}/{self.subj}'\n",
    "        os.makedirs(self.processed_datadir,exist_ok=True)\n",
    "\n",
    "        if self.space == 'nativesurface':\n",
    "            self.hemis = ['lh', 'rh']\n",
    "        elif self.space == 'func1pt8mm':\n",
    "            self.hemis = ['full']\n",
    "        \n",
    "        if not hasattr(self, 'metadata'):\n",
    "            self.get_voxel_metadata()\n",
    "    \n",
    "    def get_voxel_metadata(self):\n",
    "        self.metadata = nsdorg.load_voxel_info(self.subj, self.space, self.beta_version)\n",
    "        \n",
    "    def plot_data(self, data, title):\n",
    "        plotting.plot_ROI_flatmap(self.subj, self.space, title, data, vmin = np.nanmin(data),\n",
    "                                  vmax=np.nanmax(data),colorbar=True)\n",
    "        \n",
    "            \n",
    "    def load_fmri_data(self):\n",
    "        # Load fMRI data from the given path and preprocess it\n",
    "        pass\n",
    "\n",
    "    def find_brain_regions(self):\n",
    "        # Find brain regions with selectivities and add them to self.brain_regions\n",
    "        pass\n",
    "    \n",
    "class BrainRegion(fMRISubject):\n",
    "    def __init__(self, subj, roi, ncsnr_threshold, plot = True):\n",
    "        \n",
    "        self.savefn = f'{subj.processed_datadir}/{subj.space}_{roi}.npy'\n",
    "        \n",
    "        if exists(self.savefn):\n",
    "            print('betas already saved. loading...')\n",
    "            self.betas = np.load(self.savefn,allow_pickle=True).item().betas\n",
    "            self.rep_cocos = self.betas['rep_cocos']\n",
    "            self.included_voxel_idx = self.betas['included_voxel_idx']\n",
    "        \n",
    "        if hasattr(subj,'metadata'):\n",
    "            self.metadata = subj.metadata\n",
    "        super().__init__(subj.subj, subj.space, subj.beta_version)\n",
    "        self.roi = roi\n",
    "        self.ncsnr_threshold = ncsnr_threshold\n",
    "\n",
    "        self.roi_indices = nsdorg.get_voxel_group(self.subj, self.space, self.roi,\n",
    "                                                  self.ncsnr_threshold, self.metadata, plot = plot)\n",
    "        self.get_ncsnr()\n",
    "\n",
    "    def get_ncsnr(self):\n",
    "        \n",
    "        self.ncsnr = []\n",
    "        if self.space == 'nativesurface':\n",
    "            self.ncsnr = np.concatenate((self.metadata[0]['lh.ncsnr'].values,\n",
    "                                         self.metadata[1]['rh.ncsnr'].values))\n",
    "\n",
    "            self.ncsnr[np.logical_not(self.roi_indices['full'])] = np.nan\n",
    "        elif self.space == 'func1pt8mm':\n",
    "            raise ValueError('not implemented yet')\n",
    "        \n",
    "    def load_betas(self):\n",
    "        \n",
    "        if not hasattr(self, 'betas'):\n",
    "            self.betas, _, self.included_voxel_idx, self.rep_cocos = nsdorg.load_betas(self.subj, \n",
    "                                                                                 self.space, \n",
    "                                                                                voxel_group = self.roi,\n",
    "                                                                                ncsnr_threshold = self.ncsnr_threshold,\n",
    "                                                                                plot=False\n",
    "                                                                                )\n",
    "            \n",
    "            self.betas['rep_cocos'] = self.rep_cocos\n",
    "            self.betas['included_voxel_idx'] = self.included_voxel_idx\n",
    "            self.save()\n",
    "            \n",
    "    def load_train_test_data(self, train_imageset, test_imageset):\n",
    "        print('loading train and test data')\n",
    "        self.image_data, self.brain_data = nsdorg.get_NSD_train_test_images_and_betas(subj = self.subj,\n",
    "                                                                                      space = self.space,\n",
    "                                                                                      subj_betas = self.betas,\n",
    "                                                                                      rep_cocos = self.rep_cocos,\n",
    "                                                                                      train_imageset = train_imageset,\n",
    "                                                                                      test_imageset = test_imageset,\n",
    "                                                                                      mean = False)\n",
    "    def get_ncsnr_mask(self, threshold):\n",
    "        self.ncsnr_threshold_ = threshold\n",
    "        self.mask = self.ncsnr[self.included_voxel_idx['full']] > self.ncsnr_threshold_\n",
    "\n",
    "    def save(self):\n",
    "        np.save(self.savefn, self, allow_pickle=True)\n",
    "\n",
    "\n",
    "#class NoiseCeiling: \n",
    "#    def __init__(self, Br, \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "3b4f5aa0-ffe0-4bb8-9fc0-bf4a9b4bddc8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "betas already saved. loading...\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAACN0AAAROCAYAAADqutahAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAADc1klEQVR4nOzdd5hU1fk48HeXDkoTEWygFBUVu6AGUWPXKPYSEWyx12iMJVFjTLB8bSkaYwV7iViwoQIKgg2xN1QssSIdlDq/P/xhgLmzzOzO7pT9fJ5nnwfOnXvuO3duPfe951SkUqlUAAAAAAAAAAAAWassdAAAAAAAAAAAAFBqJN0AAAAAAAAAAECOJN0AAAAAAAAAAECOJN0AAAAAAAAAAECOJN0AAAAAAAAAAECOJN0AAAAAAAAAAECOJN0AAAAAAAAAAECOJN0AAAAAAAAAAECOJN0AAAAAAAAAAECOJN0AAECZ6dy5c1RUVCz1N3DgwEKHBdWy7LZcUVERF154YaHDKjrvvPNODBo0KPbZZ5/o3r17tG/fPpo0aZK4/qZNm1bocKlHRo4cmbgdjhw5stChFXVsAAAAQGloWOgAAAAAgOp5991345RTTomnn3660KEAGYwZMyaGDRsWL7/8crz//vsxZcqU+PHHH2OFFVaI9u3bx3rrrRd9+vSJvfbaK7p3716nsaVSqXj//ffjlVdeiY8++ihSqVTaZwYOHBidO3eu07hKzSeffBJvvPFGfPzxx/HVV1/F7NmzY+7cudGsWbNYYYUVYo011oguXbrEpptuGiuvvHKhwy1ac+fOjddffz0mTpwYn376aXz//fcxZ86cmDdvXrRq1Spat24drVu3jlVXXTU23XTTWGuttQodcsFMmzYt3n///fj888/j888/j2+//TbmzJkTc+bMiUaNGkXr1q2jVatWsfrqq8dmm20W3bt3j8rK2n//dtKkSTFmzJh466234q233oqJEyfG1KlTY9q0aVFRURFt27aNNm3axGqrrRa9evWKrbbaKn7xi1/EiiuuWOuxFatFixbF66+/Hi+99FK8/fbb8dZbb8Vnn30W06ZNixkzZkTTpk2jTZs20aZNm+jatWv07t07ttpqq+jdu3c0aNCgzuL86KOPYuTIkfHSSy/FhAkT4rvvvotp06bFzJkzo1mzZtG6deto06ZN9OjRI7bYYoufY6yoqKizGAEACkXSDQDAEmbMmBFXXnnlUmVrr712HH744VXO9+yzz8Zzzz23VJkHFADUpqFDh8Zhhx0Ws2fPLnQoQII77rgjLrnkknj33XcTp0+fPj2mT58eH374YTz88MNx1llnxU477RR//vOfY8stt6yVmCZOnBivvPLKz3/jx4+PmTNnVjnPdttt55p2GYsWLYpnn3027rrrrnjiiSfiyy+/zHreddZZJ/baa6849NBDY+ONN652DIMGDYr33nuv2vPXlltvvTWnz3/44YfxwAMPxMMPPxyvvvpqzJs3L+t5V1pppdhss81ijz32iIMPPjjat2+fY7SlYfr06TF27NgYM2ZMvPLKK/Hmm2/Gf//735zqWGGFFWLnnXeOI488Mnbddde8JWvMmTMnHnvssXjsscdixIgRMWnSpCo//+WXX8aXX34Zb7/9djz11FM/x9a/f/846aSTokePHjWOaejQoTF06NAa15OLK664Itq1a5f157/55pt48MEH46mnnopRo0bFlClTMn52/vz5MXPmzPjss8/i9ddfjwceeCAiIlZfffU47rjj4phjjqm1bT+VSsV9990X1113XZW9wM2cOTNmzpwZn3/+ebzxxhtx9913R0REt27d4uijj47jjz++XidWAQDlryKV9AoLAEA9NWzYsNhzzz2XKvvtb38bV1xxRZXz7bHHHvHYY4/9/P+KioqYPHlytG3btlbirI5bb701rRG0c+fOZT3s0IQJExIbXE877bRo3bp1ncdTVzp37hyffvrpUmUDBgzI+SEIFIOkt2MvuOCCej/E1Jtvvhm9e/eOOXPm5Dzv1KlTy/oYSHEZOXJkbL/99mnlI0aMiO22267uA1pCbcX27bffxiGHHBLPPvtsteavrKyM0047LS699NJo2LBm78tNmDAh7r777njllVfi1VdfrdbwcsXwWxWLhQsXxuDBg2PQoEHxwQcf1Li+bbfdNv74xz/GL3/5y5zn3W677WLUqFE1jiHfsm1qfuaZZ+Lyyy+PJ598Mi/LbdiwYey0005x7LHHxt57752XOovBq6++GltuuWUsWrQob3Wuueaacc0110S/fv2qXcfo0aPj2muvjWHDhlXrWiRJRUVFnHrqqfGXv/wlmjVrVu16LrzwwrjooovyElO2Pvnkk6ySE2+77ba45ZZb4vnnn8/bb7riiivGVVddFUcddVRe6lvsww8/jGOOOSYvx5nVV189rr/++thjjz3yEBkAQPHR0w0AwBKW7a0mIpb7kGHhwoUxevTopco22GCDokq4ifgp6WbZBrO+ffuWfdJNUoPrwIEDPXAGStrJJ5+c8SHXGmusET179ozWrVsnPrBv3LhxbYcH9daHH34Yv/zlL+Pzzz+vdh2LFi2KK6+8Mt5888146KGHavTweejQoXHppZdWe37+57XXXotjjjkmXn311bzV+dxzz8WOO+4YBx54YFxzzTXRoUOHvNVdrD766KM47bTT4tFHH81rvQsWLIjHH388Hn/88ejdu3dceumlse222+Z1GYUwf/78vCbcRER89tlnsc8++8Tee+8dt99+e6ywwgo513H33XfHfffdl9e4UqlUXH311fH444/H0KFDY911181r/bWpUaNGWX3u8ssvj7fffjuvy545c2YcffTRMXTo0Ljrrruq9Xsua8SIEbHnnnvmLaHqiy++iD333DMuuuii+OMf/5iXOgEAiomkGwCAJSybdFNZWRl9+vSpcp7x48fHjBkzlirr27dv3mMDgIifEgqT3jru1KlT3HrrrXqkgAL58ssvl5tw07179+jRo0e0aNEivv/++3jttdfim2++Sfzs8OHDY//9949HHnkkKisraytssnDDDTfEySefnNPQR7m4995747nnnov7778/ttlmm1pZRjG4884749hjj41Zs2bV6nLGjRsXffv2jUsvvTR+97vf1eqyStlDDz0UO+20Uzz++OO18kJCZWVlrL322tG+ffto3759NG3aNCZPnhzvv/9+lcfJ999/P7bddtsYPXp0dO/ePe9x5VvPnj1jtdVWy1t9TZs2XWq9LVy4MCZPnhyvv/56lb2VPfroo7HTTjvFs88+W6Nkzeeff365CTcNGjSIDTbYINZYY41o1apVzJo1K7755puYMGFC/Pjjjxnnu+CCC6Jx48bx+9//vtrxAQAUI0k3AAD/35w5c9LeXN14442jVatWVc43YsSItDJJNwDUlocffjix/P7774/NN9+8jqMBIn7q+fCQQw7J+CD5wAMPjAsvvDDWW2+9pcpTqVQMHz48zj333MQeVB577LG4+OKL44ILLqiVuFm+3//+98vtLahHjx6x9957x7bbbhvrrrtutGvXLpo1axazZ8+Or776Kt5+++0YMWJE/Oc//4kvv/wysY6vv/46tt9++7j77rtj3333rY2vUlDnn39+XHLJJVV+pnnz5rHLLrtEnz59YpNNNom11lor2rZtG82bN4+5c+fGrFmzYtKkSfHBBx/E6NGj4+mnn46PPvooY32Z1nWpW2211WLrrbeOTTbZJLp16xbdu3ePlVdeOVZcccVo2rRpzJw5M6ZMmRJvv/12jBs3Lu6+++745JNPEusaN25c7L///vH000/nJbauXbtGv379om/fvvGLX/wiYzLPRx99FNdff31cf/31iUlY3333Xey5557x2muvRYsWLfISW205+uijazR/RUVFbL311rHbbrvFtttuG7169UrslXDRokXx0ksvxVVXXRX3339/Yg9I48aNi6OOOiruvPPOasUye/bsOOywwzIm3HTt2jXOPvvsOPjggxN71Jk/f348/vjjcemll8YLL7yQWMd5550XO++8c2y66abVihEAoCilAABIpVKp1PDhw1MRsdTfGWecsdz5dtttt7T5vvnmmzqIODd9+/ZNi7Nv376FDqtW3XLLLWnfOSJSn3zySaFDq1WdOnVK+84DBgwodFhQLUn78AUXXFDosApq1113TVsnm266aaHDgkQjRoxI3I9HjBhR6NDy6tprr038npWVlakbbrhhufPPmzcvdcQRRyTW0bBhw9Rbb71VrbguuOCCxDobNWqU2mSTTVJHH3106vrrr0+98sorqW222aZe/Fa5+P3vf5+4Thb/9e7dO6f1M3/+/NSdd96ZWmuttTLW2bBhw9TQoUNr70v9f0nXi7V1nXzGGWdUuR7XWmut1D//+c/UrFmzcq77xRdfTB111FGpxo0bp9V76qmn5v271LWxY8emWrRokdp7771T//73v1OTJk3KuY5FixalhgwZklpllVUy/gY33XRTTnWeeOKJP8/bpEmT1OGHH54aO3ZszrF99NFHqc033zxjXNncj9eFBx54IDG+pk2bpqZMmZJ1Peuvv/7P87Zr1y71+9//vlr73PDhw6v8PR9++OGc60ylUqlzzz03Y52HHnpoavbs2VnVs2jRotQll1xS5bETAKCc6JsWAOD/SxqqY3lDdCxYsCBGjx69VNm6664b7du3z2doAPCzDz74IK1ss802K0AkQETEtGnT4o9//GPitMsuuyyOOeaY5dbRqFGjuOmmm+JXv/pV2rQFCxbE6aefXu34GjZsGD179owjjzwy/vnPf8aLL74YM2fOjPHjx8e///3vOPbYY2OzzTaLhg11iL2kW2+9NQYNGpQ4rWHDhnHZZZfFCy+8kNOQfg0bNoxDDjkk3nrrrTjqqKMSP7NgwYL49a9/HW+++WZ1wi461157bVx55ZWJ0yorK+Pcc8+Nd955J44//vhq9Wiy5ZZbxo033hgff/xx9O/fPyoqKmoaclHZaKONYvLkyTF06NA4+uijo1OnTjnXUVFREYcddli88MILGee/4IILIpVK5VRv06ZN4/TTT4+PP/44brvttujdu3fOsa299toxYsSIjD31/eMf/4ivvvoq53rz7cYbb0ws33fffaNNmzY51dWxY8e4+uqr47PPPou//vWv0blz55zj2XHHHePZZ5/NuOzzzz8/5zoXLVqU8XvuvPPOMXjw4GjevHlWdVVUVMS5554b55xzTuL0cePGxVtvvZVzjAAAxUrSDQDA//fcc88t9f/Kysro06dPlfO8+uqrMXPmzKXKDC0FQG2aOnVqWlm7du0KEAkQEfHPf/4zpk2blla+7bbbxm9/+9us66moqIibb745cTiW4cOHx8svv5xzbCeeeGLMmDEjXn/99bjpppvi+OOPjy233DKaNGmSc131yTvvvBPHHXdc4rSmTZvGgw8+GGeddVa1EzyaN28eN954Y/z5z39OnD579uzYd99944cffqhW/cVi3LhxccYZZyROa968eTzyyCNxySWXRNOmTWu8rNVWWy0GDx4czz77bKy++uo1rq9YNGvWLC/rJ+KnBJc77rgjcbv94osvYsyYMVnXtfvuu8eHH34YV155Zay66qo1imuFFVaIBx98MDGhY+7cuXHHHXfUqP6a+uKLL+LJJ59MnJZNUuWSzjnnnJg4cWKceuqp0axZsxrF1aNHj4xJMm+88Ua88sorOdX3wgsvxLfffptW3rBhw/jb3/4WDRo0yDnGCy64IGOi14MPPphzfQAAxUrSDQBA/NSY99JLLy1VttFGG2Ucg36xkSNHppVJugGgNs2YMSOtrHHjxgWIBFi0aFH885//TJx26aWX5lxfu3bt4uyzz06cdu211+Zc38orr1zjB7v1zaJFi+LII4+MuXPnpk2rqKiIwYMHx5577pmXZZ133nkZE7MmTpxYrd4qisUPP/wQAwYMiIULF6ZNa9y4cTz88MOx++6753252223Xbzxxhux00475b3ucrDNNtvEjjvumDgtU2JJkt133z2vyU2rr756nHTSSYnTHnvssbwtpzpuvvnmWLRoUVp5165dc+rpKiLi17/+dda9xWRj3333jS233DJxWq7rLVOSzi9+8Yvo3r17zrFFRDRp0iT69++fOG38+PHVqhMAoBhJugEAiIgXX3wxfvzxx6XKsmlAS0q62XbbbfMUFQCkS3qACRTGs88+G//973/Tynv16lWtoVYiIo499tjEnmgefPDBmD17drXqJHuDBw+OF198MXHab37zmzjggAPyurxLL700Ntlkk8Rp1157bUycODGvy6sr11xzTeJwiBERV155Zfzyl7+stWW3adMmHnvssbz/VuUiU9LYF198UceRLC3T71XI5IxUKhW33HJL4rRMQ8TVtXytt0zDeC2v99/lyfRSUjEMGwYAkC8GawYAiPShpSKW32PNggULYvTo0UuVdenSJVZbbbW8xlZdgwYNivfee+/n/y/57yXLBg4cmHWdV1xxRbWGMJk6dWo8+uij8dxzz8Wbb74ZkyZNihkzZsS8efOiefPm0a5du+jSpUtsscUWseOOO0bfvn2r1X316NGjl+piO9NDijPPPDNWWGGFrOrs169f9OvXL+sYpkyZEs8991yMHz8+3nvvvfjggw/iu+++i5kzZ8YPP/wQLVu2jLZt20bbtm2jZ8+e0adPn9h2222jc+fOWS+D2jN//vwYPnx4PPvss/Hqq6/Gxx9/HFOmTIkffvghmjRpEq1bt4611lorNtpoo9huu+1i9913jxYtWhQ67Drx1VdfxbBhw2LMmDHx7rvvxqeffhozZsyIuXPnRrNmzaJ9+/bRtWvX6NWrV+y2226x1VZbFTrkjD7++OMYNmxYvPbaa/HGG2/Et99+GzNmzIhZs2ZF48aNo3nz5rHCCivEGmusEZ07d45u3bpFr169Ysstt4w2bdoUOvw6VQr7xMKFC+OZZ56Jp556KsaPHx8TJ06MqVOnxg8//BCtW7eOddZZJ6655prYfPPN6zSuefPmxZNPPhljx46NCRMmxMSJE2P69OkxY8aMWLBgQTRv3vznc2Dnzp2jc+fOsfHGG0evXr2iR48eUVlZ/96T+vHHH2PYsGHx2GOPxeuvvx6TJk2KmTNnRkVFRbRt2zbWWWed6NOnT+y///7Rs2fPQocbEZmHxzjssMOqXWebNm1i9913T6t79uzZ8eSTT8a+++5b7bqp2oIFC+JPf/pT4rSOHTtWq/ei5WnQoEHccMMN0atXr7TeNBbHM3jw4LwvtzZNnz49LrvsssRpO+ywQ5x44om1HkPDhg1jm222qfXllKJMw/18/fXXdRzJ0jbddNNo0KBBWnLx9OnTY/r06dGqVas6j+npp5+OSZMmpZU3bNgwp/vo2pSpp5tPP/00p3qmTJmSWN6hQ4ecY1pSx44dc1oeAEBJSgEAkNpxxx1TEfHzX2VlZWrKlClVzjN27Nil5omI1JFHHllHES9f37590+Kr6d8nn3ySUwzvvfdeqn///qnGjRvntJyOHTumBg0alJo1a1ZOy7vlllvy/p0vuOCC5S73rbfeSv3hD39IbbzxxqmKiopqLWeXXXZJjRw5Mqfvm0mnTp3S6h8wYEBe6s7G6NGjE7/jiSeemNflLFiwILXqqqumLadDhw6p+fPn51TX999/nzrvvPNSbdu2zel3a968eer4449PffbZZzkt78Ybb0ysb8UVV0x98MEHOdW1rGnTpqXWXnvtxPrPPPPMnOt7+umnUzvvvHOqsrIyp3XTrVu31M0335xauHBhjb5PdffLJA8//HBqm222qfbxoKKiIrXVVlulrrrqqtSMGTNq9L2yMWLEiLwez3I5DtT1PpHtdx8xYsTPn1mwYEHq2muvTa2xxhrLjevBBx+sUTy5mDx5curUU0/Ned0t+bfSSiuljj766NTo0aOzWmY266u6kq4n+vbtm/X82f6WV1xxRap9+/ZZr6Ptttsu9corr9Tou40aNSrVpEmTtL9Ro0ZlXUe3bt0S4/v4449rFFum88Rxxx1Xo3qrkunaMR/bUal44IEHMm5zd955Z60u+/jjj09cbqNGjVLffPNN3peXdL0Ykfv1fpJrrrkm43n09ddfr3nw1Mhjjz2W+PvstddehQ4t1aFDh8TYPv/884LEc+CBBybGs/feexckniTvvfdeYoxdunTJqZ4zzjgjsZ5//OMfNYrvrbfeSqx3s802q1G9AADFpP69NgUAsIwFCxbE2LFjlyrr2bPncnszMLRUZgsXLow//vGPseGGG8aQIUNi3rx5Oc3/1Vdfxe9///vYYIMN4plnnqmlKPNjq622ig022CAuvvjimDBhQqRSqWrV8+STT8Z2220X++yzT8ycOTPPUdatbbbZJrp165ZWftddd8XcuXPztpynnnoqvvzyy7Tyww8/PBo2zL5Tz/vuuy/WXXfduOSSS3J+43LOnDlx3XXXxXrrrRd/+9vfsp7vqKOOiv79+6eVz5w5Mw444IC04e5yceSRR8bHH3+cVr711lvHX//616zr+eKLL2KvvfaKHXfcMZ566qm0t++X58MPP4wjjzwytt5668R46tLUqVNj7733jr322ivGjBlT7XpSqVSMHTs2Tj/99Hj77bfzGGFxKcQ+kasvvvgievfuHaecckp8/vnntbacXN17770/96xTkze4v//++7jxxhvj4osvzmN0xembb76JbbbZJs4888z49ttvs55v5MiR0atXr7jkkkuqvexFixbF3Llz0/6yPd5988038eGHH6aVr7nmmrHWWmtVO66IiO233z6xPKl3RvJnyR4Tl7TKKqvU+lBFJ510UmL5/Pnz49Zbb63VZefbDTfckFi+2267FU0vVcuqqKhI/Eu65yt1SUPiRdS8R5N8mD9/fmJ548aN6ziSn87FQ4cOTZx2zDHH1G0wVcjXOlt99dUTy2vaA1KmYaTWWGONGtULAFBMJN0AAGWrc+fOGRtPl/xr1KhRzJ49e6l5J0yYsNz5zjnnnLRlDhw4cLnzXXjhhXW0Bgpj1qxZsdtuu8XFF1+csQEwW5MmTYpddtmlVh/c1lTSw7aaGDp0aGy11VaJ3ZiXkiOOOCKtbMqUKfHwww/nbRmZHkAlLTuTc845Jw488MD47rvvahTL7Nmz45RTTolf//rXsWDBgqzmWZyYsKzXX389TjnllGrFcfXVV8d//vOftPKVVlop7r777qyTkUaOHBmbbrppPPLII9WKY0kvvvhibLHFFmnJjXVl8uTJscMOO+R12ytnhdwnsvXJJ59Er1694pVXXslrvTX173//Ow4++OD4/vvvCx1Kyfjmm29i6623jhdffLFa8y9cuDDOP//8OOaYY6qd9FoT48ePTyzPx1Bma6+9drRt2zat/P333485c+bUuH7SzZgxI55++unEaQMGDMgpobc6evToEb17906clnRuL1bvv/9+xsTUI488so6jIclTTz2VWL711lvXcSRLmzp1auI5tGHDhonHw9o2ePDgxJdHVl999dh1113rPJ5MMt2PrrLKKjnVk2k4tueffz7nmJY0atSoxPJf/OIXNaoXAKCY1O7dIgAA9crcuXNjjz32qPIt7IqKithggw1itdVWi9atW8fXX38dEydOjC+++CLx8wsXLvw5AeHkk0+ulbhrS4cOHWLttdeOVq1aRevWrWPBggUxffr0+OSTT2LixIkZHxC+/fbbse+++8bYsWOjSZMmdRx1fhx++OFx/vnnp/UWcOutt+blTfGpU6fGQw89lFbeu3fvWHfddbOq4+yzz47LLrusys+stdZasdZaa8Uqq6wSU6ZMic8++yzefffdjJ+/8847Y968eXHvvfdGRUVFlXW3aNEi7r///thiiy3SHqD++9//jr59+8avf/3rrL5LxE/JLb/73e/SyisqKmLw4MFZv036xBNPxD777FNlbzstWrSInj17Rrt27WLFFVeMKVOmxKeffppx3UyZMiV22WWXeOGFF2KDDTbI7gvlyYABA2LChAkZpzdt2jS6du0anTp1ihVWWCEaNmwYM2bM+HlfLaZeVGpbofeJbMyePTt23XXXxF6u1lhjjejSpUu0b98+Kioq4ptvvonXX389pk6dWuPlLs+LL74Yxx13XJWJH6uuump07do12rVrF82bN48ff/wxpk+fHpMnT4733nsvfvjhh1qPs5gsWLAg9t5778SesDp37hxrr712tG/f/ufjy/vvv5+xrhtvvDFWWmmlGDRoUG2GnOaNN95ILF9//fXzUn+PHj1i9OjRS5UtXLgw3nnnnbwk9rC0p59+OmPC+MCBA+skhoEDB8a4cePSyl9++eWYPHlytGvXrk7iqIlhw4Ylljdr1iz22GOPOo6GZX3wwQeJichNmjSJ3XbbrQAR/c+IESMSy7t161brSW9JbrrppsTygQMHRoMGDeo4mswyrbek5P6qbL755tGlS5f46KOPliofPXp0fPDBB9G9e/ecY5s7d27cfvvtaeUNGjSI/fffP+f6AACKlaQbAIAytWxX6Nttt13aW2Z9+/bNa5fpJ510UsaEmxVWWCHOPffc6N+/f2LX1WPHjo1rr7027r777sT5Tz/99OjRo0f88pe/zLj8gQMHLvVQ5NZbb03s9eSTTz6Jzp07V/1lqmHNNdeMfv36xW677RabbrpptG/fPuNnp02bFv/5z3/in//8Z7z66qtp01977bU488wzi7qXn6qsttpqsfPOO8cTTzyxVPmTTz4ZX331VXTs2LFG9WcaqirbN6jvuOOOjMkFFRUVccwxx8Txxx8fG2+8cdr0jz/+OG6++ea4/PLLE99+vf/+++Oiiy7KqlerHj16xHXXXRcDBgxIm3bcccfFZpttllUS0dSpU+Oggw5KfFj4u9/9Lnbffffl1hHx03a33377JSbcNGzYMA4++OA4/vjjY8stt0x8+PHf//43brnllrj88stjxowZS02bOXNmHHLIIfHyyy9H06ZNs4qnph566KF47LHHEqftuuuucdppp8V2221XZXLb9OnT49VXX41hw4bFI488kvferarSoUOHxG3jtttuSyvbaKONErfXJVX1RnGx7BPLc+6558YHH3zw8/8bN24cJ598chxxxBGJiQ4LFy6Mp556KlZdddUaL7sqxx9/fOKQRO3atYszzjgjDj744CqHG1q0aFFMnDgxRo4cGQ8//HA888wzNRpmrhRceumlaT3cHHHEEXHSSSfFpptumvb5999/P2644Ya45pprYuHChYn17bLLLhmHZaoNmYbO69q1a17q79q1a1rSzeLlSrrJv0zXsO3bt8/54XV19enTJ7F80aJF8cILL8Ree+1VJ3HURNI2G/FTLxp1df4n2dSpU+PQQw/NeA1d1b1LXRg8eHBied++fes4kohx48Yl9thUUVERRx11VJ3Hk8ncuXPj3nvvTZyW63qrrKyM3/72t3HCCScsVb5gwYI4+eST47HHHss52eiiiy5K7MH1kEMOiU6dOuVUFwBAUUsBAJSpTp06pSKi6P4uuOCCgqyPvn37psXSt2/fvNU/bNiwjN+5V69eqUmTJmVVz4MPPphq0aJFYj1rrLFGaubMmVnHdMsttyTW88knn1TzW6ZbeeWVU/369UuNGTOmWvMvXLgwdc0116QaNmyYFmdlZWXq448/zrnOpG1/wIAB1YqvJu69997E9X/ppZfWuO7NN988rd5mzZqlpk+fvtx5v/zyy1SrVq0SY1t55ZVTo0aNyiqGt956K9W9e/fEeho0aJB69dVXs/4+Rx11VGI9G2ywQWrOnDlVzrto0aLUr371q8T5f/GLX6Tmz5+fVQyzZ89OdenSJbGeDTfcMPXOO+9k/X2++uqrxN8oIlInnXRS1vWkUqkaHUf32muvxPmvu+66nGJY0siRI1P9+vVLvfTSS9Wuo6byfW4pxn1ixIgRyz2frrfeeqkPP/ywul87b8aPH58Y38Ybb5z66quvqlXnlClTUoMGDUodffTRWX0+0/oaMWJEtZa/pJpeP2TzW7Zs2TL1xBNPZFXfSy+9lFpttdUS6+natetyj5nZxJbtett5550T53/mmWeyjqEq5513XmL9gwYNykv9y0r6rfO1HZWCbbfdNvH777bbbnUWw8KFCzNeB+f7HiLTvVJNr5PXXHPNxHr/8Ic/5CfwWpLp+FQu2/+IESNS66yzTuJ3XHPNNVPTpk0raHxvvfVWqrKyMjG+p59+us7jyXRtvuOOO9Z5LFX55z//mRhns2bNUjNmzMi5voULF6b69OmTWOevf/3r1OzZs7OqZ9GiRalLLrkksZ5VVlkl9d133+UcGwBAMdPTDQBQtvbff/+YPHlylZ/57LPP0rpj3nDDDRPfsF7SsGHD0uo+7LDDsnrza3k9EZSihQsXxmmnnZY4rWfPnvHEE09E69ats6qrX79+8cADD8SvfvWrtF47Pv/88xg0aFD8+c9/rmHE+fPSSy/VqNecysrKOOWUU6JDhw5x8MEHLzU0yaJFi+Jvf/tbXHnllXmItO7ttdde0bZt25gyZcpS5bfcckviMEjZevvtt+OVV15JK99vv/2iZcuWy53//PPPj+nTp6eVt2rVKp588snYZJNNsopj/fXXj+HDh8c222yTNjza4mHRMr3tvay//e1v8fLLL6cNVfLWW2/FiSeeGDfffHPGea+44op45JFH0srbtWsXd999d9bd8V944YVp3clHRGy77bbxxBNPRLNmzbKqJ+KnHlpGjRoVffv2TfutrrvuujjrrLNizTXXzLq+6pg7d2489dRTaeWHHXZYHHfccdWut2/fvgV547o2FeM+sTzrrbdejBo1KlZeeeW81FcTSftfZWVl3HPPPdGhQ4dq1dmmTZs4++yzaxpaSWjSpEkMHTo06x5qtthii3jiiSeiT58+MW3atKWmTZw4MS6//PL44x//WAuRpvv2228Ty6v7uy8rU69wmZZLzST1ahHx0zZXVyorK2OTTTZJPFZmiq+YzJo1Kz777LPEaXU9vGR9lUqlYvbs2TF9+vR4//3345VXXon77rsv8do5ImKVVVaJxx9/PFq1alXHkS7ttNNOS+wxbv31148ddtihTmOZNWtW3HPPPYnTjjnmmDqNpSpTp07N2IvgwIEDY8UVV8y5zsrKyrj//vtj++23j3feeWepaXfccUe89NJLcfbZZ8dBBx0UK6ywQtr88+fPjyeeeCIuvfTSGDNmTNr01q1bx7Bhw0piqDwAgFxIugEAytYVV1yx3M/86U9/Sku6+f3vfx+HHnpoxnkWLlwYK6200lJlXbt2jSFDhlQv0DJw3333JQ650rRp0xg6dGjWCTeL7bLLLvHnP/858YHj3/72t/jd736XVXJFXcjXMFUHHnhgPPbYY2nDxtx8881x2WWXZZ04UUyaNGkShx56aPz9739fqvy9996LcePGRe/evatV7y233JJYns3QUp9//nnGffX666/POrlgsTXXXDPuu+++2HrrrZdKmIqIGDNmzM+JJ8vTrFmzuO+++2LzzTePmTNnLjXtlltuib59+yYOM/TCCy/Eueeem1ZeUVERt99+e6y22mpZfY///ve/iUOZrb322jF06NCcEm4Wa968edx3333Rs2fPpb7TwoUL49prr83qGF0TX375ZeLwPIcffnitLrfUFOs+UZUGDRrEkCFDiiLhJiISk9V69+4d3bt3L0A0pefCCy/MeUioDTbYIP75z38mXq/961//inPPPbdOzpvff/99Ynmu1z2ZZHoInmm5VN8PP/yQcb3W1dBSSy4vKenm888/r9M4qqOqGKsaYo/q6dq1a+I5KFu/+MUvYvDgwQX/bf7973/H008/nTjtwgsvjIqKijqN5+67745Zs2allbdr1y769etXp7FU5aSTTkpMwmzWrFn8/ve/r3a97du3j1GjRsXAgQNj2LBhS0378MMP4+ijj45jjz02Ntxww1hjjTWiZcuWMWfOnPj6669jwoQJ8cMPPyTWu8EGG8Rdd90lAQ8AKEuVhQ4AAKCQlk24iYjlPvh57bXX0noE2G677fIZVsn597//nVh+9tlnV7sR9/TTT4911lknrXzGjBkZ3zwsdeedd15a2fTp0+P1118vQDT5ccQRRySW33rrrdWqb8GCBXH77benlXfu3Dmr/fDWW29N60Ep4qd9+OCDD65WTL179874PW+44Yas6+nevXvGz59wwglpb7hPnjw5DjrooFiwYEHa588555zYZZddsl72ddddl5igcuWVV0abNm2yrmdZnTt3jhNOOCGt/MYbb4y5c+dWu95sfPPNN4nltd3DTqkp5n0ik6OPPjo222yzGteTL0nbmu0sO126dInT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f5deemnceuutS/0NGTIkHnnkkRgzZkxMmzYt3nzzzTj77LNj5ZVXTpv/xx9/jDPOOCOOO+64Ok28+e1vf5vYe2XETwm7V111VZ3FsqQHH3wwvv/++7TyFVdcMQ466KACRPQ/P/zwQ+y5557x+uuvJ06/7LLLYr/99svLsoYPHx6bb7554rIqKipi9913j+uvvz7eeOON+Pbbb2PevHkxZcqU+PDDD+Ouu+6KI488MvFY8P3338c+++wTl1xySV7iBAAoJvnp7xYAoMTMmjUr7WFMz549Y6WVVqpyvqQeIbbffvt8hlZykh5YN27cONZdd9281J/poVyxPShPpVJxzz33xC233BLPPPNMXt9GLvWkm4ifEmP+85//LFW2aNGiGDx4cJx33nlZ1ZHUON+qVavYd999s5o/0zbTs2fPrOZfnnxvq/vuu2+ceuqpcc011yz3s9tvv31ccMEF1VpO0hA4jRs3jmOPPbZa9SV57bXX0sqmTJmSt/ozOeuss+Lf//53zJw5M23axx9/HL/73e/id7/7XWy00Uax/fbbx3bbbRdbb7114oOpclRq+0RE5mHDCql9+/Zx0kknxeWXX542bcGCBXHPPffEPffcE61atfp5O+vTp09stNFGeelRqFTlazvbcMMNE8u/+OKLvNRflcaNGycmEsydOzcvvaNkSlJo0qRJjetmac2bN884bdmE+9qWaXmlnnQze/bskvgO5aSioiI22GCDGDRoUJxzzjlxxhlnJCZ133DDDbHyyivHn//851qP6aKLLoorr7wycdoOO+yQ8zCp+ZRpCNJDDjkkWrRoUcfR/M+8efNin332Setxd7Fzzz03zjzzzLws68UXX4y99947cfiqzTffPG699dZYf/3106a1adMm2rRpE127do2DDz44Bg0aFL/97W8TXyg5//zzo1WrVnHSSSflJWYAgGIg6QYAqJeef/75tLeQlze0VERy0k197+nmm2++SStr06ZNNGyYn0vN9u3bJ5Z//fXXeak/H1577bU44YQTYty4cbVS/5w5c2ql3rq06667RocOHdJ+t1tvvTWrpJs33ngjMXHj4IMPzvoBTtK2GpF5G8vVSiutFJWVlbFo0aKlymuyrV522WUxduzYKofjWWWVVeLOO++s9gOKpAfTP/zwQ9x2223Vqi9bdZF006FDh7jjjjtin332qTIR7vXXX4/XX389rr766oiI6NatW2y//fax/fbbxy677BJt2rSp9VgLoRT3iUxDZRTan//85xg7dmzGB2IRPz1IHzp06M9DK7Ro0SK22Wab2H777WPHHXeMzTffvI6iLQ5JPWBVR6YkubpIWG3VqlViUt/MmTNjhRVWqHH9SXUvXi75VdVxr66TnzMtb5VVVqnTOKqjqhi/+eabvO335K5Vq1Zx0003RZcuXRKvvQcNGhR77rln9O7du9Zi+L//+7+48MILE6dttdVW8dBDD1XZ61Rt+vTTT+OZZ55JnFbIoaUWLFgQBx98cDz55JOJ008++eS89RwzZ86cOOywwxITbvbZZ5+4++67s+5pbeWVV47BgwfHhhtuGL/73e/Spp955pmx3XbbxQYbbFDjuAEAioHhpQCAemnZoaUilt9jzcKFC9Mepq2zzjpF+dZ9XZo9e3ZaWT4fimZ6sJS03EJ44oknYuutt661hJuIqNPu3mtLw4YN4/DDD08rnzhxYpUPqRe75ZZbEsuzHVoqIvM2k6/ttaKiIrGummyrjRs3jnvuuSdjjwmVlZVx55131ug4VNdv8C+W6WFyvv3qV7+Kxx9/fLk9mS3pww8/jBtuuCEOOeSQ6NChQ+y7777xxBNP1GKUhVGK+0Q+EhlqQ+PGjePJJ5+Mgw8+OOt5Zs+eHU899VScc845scUWW0S3bt3ioosuismTJ9dipMUjX9tZpnrqIlEi03ElX8vOVE8uxzOys/LKK2fsQaguek1a0n//+9/E8tVXX71O46iOqmKs6/VIsnPPPTcOO+ywtPKFCxdWu9fEbFx33XUZe2PZdNNN4/HHHy/oOf6mm25KSxKO+KlXti222KIAEf3UK+jhhx8eDz74YOL0o446KqseMbN17bXXxsSJE9PKe/bsGXfccUe1hjY866yz4sgjj0wrnzt3bpx11lnVihMAoBjp6QYAKBvvvfdeDBo0KKvPDh8+PK3stttuiwceeCDjPLNmzUp7OP3jjz/GwIEDl7u8K664omzf7Jw3b15aWT67385UV9Jy69pzzz0X/fr1yzj8w2LNmjWLTp06RYcOHaJVq1bRokWLaNiwYVRUVKR9dvTo0fHRRx/VVsgFdcQRR8Rll12WVn7LLbfEL37xi4zzzZ8/P+6444608h49ekSvXr2yXn6mbSbf2+uyD0lruq3ef//9MX/+/MRpjRo1irZt29ao/h9//LFG85eCnXbaKT744IP461//Gtdff33MmjUr63nnzZsXDz74YDz44IPRu3fv+Pvf/x6bbbZZLUZbd0p1nyhWzZs3j7vuuisGDhwYf/jDH9KGsVyeiRMnxoUXXhhXXHFFnHHGGXH++efnZYiiYlXVcD65yLS95rKfV1emXj2+/vrrWG+99Wpcf6ZeofLVGxVL69KlS7zzzjtp5a+88kqdxpFpeV27dq3TOKpjlVVWiRVXXDExsfbdd9+NXXbZpQBRsazLLrssHnjggbQeTZ566qmYOHFi3re1m2++OU488cTEaeuvv348+eSTBe3Ba9GiRRkT/AvVy00qlYqjjz467rrrrsTphxxySNxwww2J95PVsXDhwvj73/+eOO3SSy+t0dBwgwYNinvvvTftvPzkk0/Ge++9l7dhqQEACknSDQBQNr7++usaDYdSVcJNJp9++mlWy7zwwgvLNummcePGaUkn+eyFJlNd1XnTLp/mz58fxx57bMaEm1/+8pdx8MEHx7bbbhvdunXLukF04MCBZZt0s+6660bv3r3TegW677774m9/+1vGB7DDhg2L7777Lq08l15uIjJvM7Nnz85bQ3/S9lqTbXXs2LFx7rnnZpw+d+7cOPDAA+PVV1+NFVdcsVrLaNCgQeKbveWmbdu2cfnll8eFF14YDzzwQAwdOjRGjRqV0zBX48aNi6233jr+8Y9/FHSogXwpxX2iFOyyyy6xyy67xBtvvBG33357DB8+PN54442s97NZs2bFn/70p3jqqafi4Ycfzjh8UqnL19CJmZJr6qLHhM6dOyeW56tHj0w9nqy11lp5qZ+lbbLJJgVPuvn2228zbj+bbLJJncVRXRUVFbHxxhvH888/nzZt/PjxBYiIJB07dowdd9wxHnnkkbRpzz77bF6Tbu6444445phjEnvu7N69ezz99NMFv09+4oknEve7pk2bJvYKVBdOOOGEjIlA++67bwwePDgqK/M3iMFrr72WeM7p3Llz7LrrrjWqe+WVV4799tsvrd0klUrFsGHDJN0AAGXB8FIAANRI0hvmM2bMyFv9mYa+yWdPDNXxr3/9K95777208nbt2sVTTz0VTz/9dBx99NHRvXv3nN5ArKshdwolKVFm5syZcf/992ecJ6nBuWHDhtG/f/+clp1pm8nX9ppKpRLrqu62OmXKlDjooIMy9nKz2Icffhi/+c1vqrWMiOT42rdvH6lUqtb/CqFFixZx+OGHx3/+85+YPHlyTJgwIa699to48MADsxqma968eXHsscfGQw89VAfR1q5S2ydKTc+ePeOyyy6L1157LSZPnhwPPfRQnHnmmdGrV6+serAZN25c7L333svtTa1U5Ws7y1RP69at81J/VdZee+3E8qThOaojUz2ZlkvNbLnllonl77//fp0NxVhVD1mZ4is2meIcOXJk3QZClXbcccfE8nwmmd1///0xYMCAxKTTtdZaK5555pmiGKr5pptuSizfb7/9ok2bNnUcTcSpp54a119/feK0PfbYI+6+++5o2DC/71KPGTMmsXynnXbKS/2ZtrdMywUAKDWSbgAAqJGkoRWmTp0aCxYsyEv93377bWJ5oRto77333rSyhg0bxqOPPlqjxslcet0oRQcffHBi9+SZ3uT89ttv47HHHksr33333TMO65FJps8n9aJTHd9//33iQ4XqbKupVCoOP/zw+Pzzz7P6/N13352xcX55kuKbOnVqteoqNRUVFbHRRhvFySefHPfcc0989dVX8cEHH8RVV10V2267bcb5Fi1aFMcee2zeeuoolFLaJ0pdmzZtYq+99orLL788xo0bF9OmTYvHHnssjjvuuCrf8B87dmzG4R7qSm0N05Sv7Wzy5MmJ5XXxoHTDDTdMLH/77bfzUn9SryuVlZWx/vrr56V+lpZp6KNFixbFfffdVycx3HPPPYnlq622WmywwQZ1EkNNZVqPn3/+eUyYMKFugyGj1VZbLbE8X8fmhx56KA499NBYuHBh2rQ11lgjnn322Vh99dXzsqya+PbbbxN7/IkozNBSv/vd7+Laa69NnLbjjjvG/fffXytDT2bqWa1Lly55qT9TPZmWCwBQaiTdAABQI2uuuWZa2bx58xJ7gamOTI3zScutK1OmTIkXXnghrfyQQw6JXr161ajucm94bNmyZey3335p5aNGjYpJkyalld9+++2JCVy5Di0VkXmbef3113OuK0k+t9XLL788hg0bllbesWPHuOGGGxLnOf3006v1MCupx4T58+eXfQJYJt26dYvTTjstRo0aFe+++27stddeiZ/75ptv4tZbb63b4PKslPaJctO8efPYbbfd4rrrrosvvvgi/vWvf8VKK62U+NnLL798uT1DNWnSJLF83rx5NY61to4Fb775Zl7qeeONNxLLMz1QzqfNNtsssTwfPUV88skn8f3336eVr7POOhmHY6Rm1llnnejWrVvitEw9YeTT9OnTM/b8t8cee9T68vOlb9++GYcovP322+s4GjLJNCxpPnrdfOyxx+LAAw9M7K2xY8eO8eyzz2Ycnq+u3XbbbYlxdu3aNbbbbrs6jeX888+Pyy+/PHHatttuGw899FA0bdq0VpY9bdq0xPK2bdvmpf5M1zj1JdEfACh/km4AgLKx3XbbLXcokx9++CHtwVSvXr2WO99f//rXtOXdddddWQ+hUiyNirUh01u3r732Wl7qz1RPprfL68JHH32U+NbmPvvsU6N6v/vuu/jwww9rVEcpSEqYSaVSiQkMt912W1pZ+/btq/XwqVS21RdeeCHOO++8tPIGDRrEnXfeGcccc0ycfvrpadN//PHHOOCAA3J+WLLpppsmlo8bNy6nesrRuuuuGw899FCccMIJidOfeOKJOo4ov0plnyh3TZo0id/85jfxwgsvJA6J9M033yz3N2nZsmVieU2HcJo3b1589dVXNaojk3z1eJEpSWyLLbbIS/1VWWWVVRKTND799NP49NNPa1T3iBEjEsur6oWLmhswYEBi+bhx4+Ktt96q1WXfeeed8cMPPyROq06ycaE0btw4Dj300MRpN910U9kPpVoqMvVoU9Okvqeffjr222+/xKTP9u3bxzPPPBNdu3at0TLyKVNC3VFHHVWncfz5z3+OSy65JHHaVlttFcOGDavVhMtMQ3/Onj07L/VnqidT8hcAQKmRdAMA1Cvjxo2LuXPnLlWWzRtso0aNSiur6zffaqpx48ZpZfkYAipTzy6ZuunOxcyZMxMfOjVt2jSrh7ZJ3zmi5t/7m2++SSxfa621alTvyJEjazR/qdh+++0TE9Fuu+22pXpzGD9+fGIPBocddli1ulXfcssto6KiIq388ccfT0yiytVDDz2UcbnZ+v777+Oggw5K3EYvuOCCn487l156aeK+N3HixDjmmGOyXl5ERJ8+fRLLn3322ZzqKWeXX3554lv7+eoRplBKYZ+oT7p37x5nnXVW4rTlbWuZkm5qmjDzyiuvxI8//lijOjKZMGFCjeObO3du4rGqQ4cOddajUqYhJZN6K8tF0tCKERE777xzjeqlakceeWTG68czzzyz1pY7ffr0uPjiixOnbbTRRtG7d+9aW3ZtOP744xPLp02bFpdddlkdR0OSTz75JLF81VVXrXado0aNir333jvxvLHSSivF008/Heutt16168+3559/Pt5///208oYNG8bAgQPrLI7LL788/vCHPyRO22KLLeKJJ56IFVZYoVZjWHnllRPLv/7667zUn+l8n2m5AAClRtINAFCvJCU19O3bt8p5Fi5cGGPGjFmqbJ111okOHTrkM7Ral/QW2Zw5c2pc7w477BCVlemXlY888kiN37C/7777Et/47dOnT1Zda2d6c66m3zvT92rWrFmN6r3uuutqNH+pqKioSHyTfNKkSUvto7fcckvi/NV927t9+/bRs2fPtPKvvvoqnnnmmWrVudjHH3+cdpyI+Omt0a222iqrOlKpVBx++OHxxRdfpE3baaedlur9plGjRnHPPfdEmzZt0j57zz335LQtbb/99om9a9x+++0Z37ivb5o3bx7bbLNNWnmmt8RLRbHvE/VRpgSO5W1rK6+8cjRo0CCtPNPQS9l69NFHazR/VRYtWhR33313jep49NFHY/r06WnlW2+9dY3qzUWmXu5qMozOtGnTEpN2WrRoEbvssku162X5OnbsGEcffXTitCeffDLuuOOOWlnuOeeck/Gh9B//+MdaWWZt2nDDDROHE434KcHgnXfeqZM48tVLRznKlNhX3aSYF154Ifbcc8/E+6zWrVvH8OHDi66nu0y93Oy55551dq9/7bXXxu9+97vEaRtvvHE8+eSTGRNr82mVVVZJLH/++efzUv9zzz2X03IBAEqNpBsAoF5ZtseaBg0aJD5IXdL48ePTukEvtV5uIpLfgv/vf/9b43pXWmml2GGHHdLKf/zxx7jmmmuqXe+CBQvi//7v/xKnHXTQQVnVkamBsqbfOynRISISkyWy9eKLL2YcSqIcDRw4MLGHjcWJNvPmzYu77rorbfrmm2+ecUicbBxwwAGJ5TV963rQoEGJ5fvss0/GN+aXdemllyY+AOnYsWPcfvvtacltnTp1ShySKyLi9NNPz3qIoEaNGsVhhx2WVv7NN9/Um0SwbCQl8WX72xazYt4n6qNMyaLLW2dNmzZNfFBak/PKnDlz4l//+le158/GP/7xj7QeCHNx1VVXJZb379+/2nXmaocddojVVlstrXzs2LHx0ksvVavOG264IbGniH322SfjECDkz/nnn59xXzz99NPzcv28pBEjRmTc13r16lXj4UsL5S9/+UvisWvu3Lmx33771Tg5f3kGDx4cf/rTn2p1GaXqzTffjBdffDFxWnWGsHvllVdi9913j1mzZqVNa9myZTz55JOxySab5FxvbZoxY0bcd999idMyJd7l2w033BCnnXZa4rQNNtgghg8fnvG+M98yJau+9NJL8fnnn9eo7oULF8Z//vOfxGnLa4sBACgVkm4AgHpj7ty5MW7cuKXKNtlkk+W+OZY0tNTyescpRklDH3377bcZh0rKRabhbP7617/Gp59+Wq06r7nmmsS3YFu1ahUHHnhgVnVkGu7pzTffrFZMi2V68/GJJ56oVn1z5sxJ7PmlnHXu3Dm23377tPIHHnggZs6cGQ8//HB8//33adOPPPLIGi13wIABiUNTPfPMMxkb3pfn5ZdfzvimbLZDPY0ePTqxW/kGDRrEnXfeGe3bt0+cb6+99orTTz89rXzu3Llx4IEHZv1A69RTT42GDRumlf/hD3+I8ePHZ1VHufvwww/TymoyBEOxKNZ9or5K2s4istvWNt9887Syjz76KF544YVqxfKHP/whpkyZUq15s/XRRx9lTJxZnrvuuiuxN6VVV1019txzz5qGlrXKyso44YQTEqedffbZOdf3/fffx6WXXpo47ZRTTsm5vmI2cuTIqKioSPwrpI4dO2ZMPPzuu+9i9913j6lTp+ZlWW+99Vbst99+sWjRorRpjRs3jptuuqng66O6unfvHhdddFHitPfeey922223Wkm8mTt3bpxyyikxYMCAnJL6Mm2L5Tb866JFi+LEE09M3Oa6deuWc3LMG2+8Ebvssktir2MrrLBCPP7440U5rOSdd96Z2CvP6quvHrvuumutL3/w4MFx3HHHLTW07mLrrbdePPPMM9GuXbtaj2PJZSYNy7hgwYK48MILa1T3rbfemvH6Ru9tAEC5kHQDANQb48aNS3trOJvkmaSkm1Ls6SZTA+qdd95Z47r333//WGedddLKf/jhh9hnn31yblB/+umn49xzz02cdsopp2R8+3hZa665ZrRt2zat/O67705saM7WBhtskBjDv/71r4xDA2Qyb9686N+/f7z//vvVjqdUJQ0TNWfOnLj33nsTe3Bp2rRpHHLIITVa5uqrr54xwenYY4/NOSHriy++iP333z9xe+rTp09WbwtPnjw5Dj744FiwYEHatAsvvHC5x5tLL700evXqlVY+ceLErBMcunbtGieeeGJa+Zw5c2KvvfaKt99+O6t6svHxxx/HkCFD8lZfJg888EA89NBDiQ8zcvXiiy8mJh9tuummNa670Ipxnyg1Z599dt56vvjnP/+ZWJ7NQ9BMDwnPOuusnPeDBx54oNrJMLm68MILc+6R5+233048ZkX8tN0mJRHWphNOOCFxmL6RI0fG1VdfnXU9qVQqjjrqqMRkpx133DG22GKLGkRJLo499tjYa6+9Eqe98cYb0adPn/jkk09qtIznnnsutt1224wJPJdeemmsv/76NVpGoZ111lmx4447Jk574YUXonfv3vHuu+/mbXmjRo2KzTbbLP72t7/lrc5Cevjhh+O9997LW30LFy6Mww8/POOQQbkm9r377rux4447Jh6zmjdvHsOGDavT4f5yceONNyaWDxw4MHG4xny6995748gjj0w8N3fr1i2eeeaZjAn3tWn//fdPLL/55purfe0+YcKEjL35bLHFFtGpU6dq1QsAUHRSAAD1xEUXXZSKiKX+Hn744SrnWbhwYap169ZLzdO9e/c6iji/vvvuu1SjRo3S1sEKK6yQGjJkSGrevHk1qv+JJ55Iq3vx39Zbb5367LPPsqrnoYceSq2wwgqJ9ay55pqpWbNm5RRXv379Eus64ogjUl9//XV1vmoqlUql9t1338R6N91009R3332XVR1fffVVaqeddsq43hb/derUKafYOnXqlFbHgAEDcv+StWz27Nmpli1bpsW6/vrrpxo0aJBWfvDBB+dluV9//XXafr34r0OHDqnRo0dnVc/bb7+dWnfddRPradCgQeq1115bbh2LFi1K7brrrol17LTTTqmFCxdmFcukSZNSbdq0SaznH//4R1Z1zJo1K9WtW7fEOpo3b5664YYbso5nWfPnz08NHz48te+++6YqKytTu+yyS9bzJsVzwQUXLHe+Cy644Odj9j/+8Y/Ut99+W63Y33nnncR9KiJSw4YNq1adNVXddZJJMe0Ti40YMSKxnhEjRlTvS9aiiEg1atQodfjhh6dGjx6dWrRoUc51LFq0KHX22Wcnfuctttgiqzp+/PHHVNu2bRPrOOmkk7KO5W9/+1viMXjJv759+2ZdX6bfcsm/li1bpp588sms6nv55ZdTq622WmI9Xbt2Tc2ZM6fGsVVnO7v22msT66qsrEzddNNNy51//vz5qaOPPjqxjoYNG6befPPNnGPKVd++fet0v6tq2ygGM2bMSG2wwQZVbrfXX399asGCBTnX+/vf/77K/awurtsynds++eSTvC5n6tSpqR49emT8rk2aNEmdf/75qe+//77ayxg7dmxq7733Tqv71FNPzbqOTPEV8rxz6qmnpiorK1OHHXZY6uWXX65RXW+99VaqT58+Gb/neuutl5o7d27W9U2cODG16qqrJtbVtGnT1NNPP12jeGvThAkTEuOuqKjI+/a/rIceeijVsGHDxOWvvfbaqc8//7xWl1+Vb7/9NrXiiismxtaoUaPUlVdemVN9jz32WGqllVbKuM0NHz68lr4JAEDdq9tXfwAACmjZrsErKyujT58+Vc7z+uuvx7Rp05YqK8WhpSIi2rVrF7/61a/SxlOfNWtW9O/fP0466aTYaKONYpVVVolmzZoldmV/xRVXZOzmepdddoljjz02/vWvf6VNe+GFF2KDDTaI8847Lw477LDEYTJefPHFuPbaazP2vNOgQYO49dZbo0WLFtl83Z8deeSRMXTo0LTyW265JQYPHhw9evSILl26xAorrJD4VmO/fv2iX79+aeW//e1vE8emHz9+fGy44YZx8cUXx6GHHhrNmzdP+8xHH30Ud955Z1x++eUxc+bMn8tbtmwZm266adl1Y59J8+bN46CDDop///vfS5Vn6lWlpkNLLbbKKqvEP//5zzj00EPTpn399dex7bbbxrHHHhvHHXdc9OzZM+0zn3zySdx8881x+eWXZxy24IILLoiNN954ubH89a9/TRyWrGPHjnH77bdHZWV2nZN26tQpbr311th7773Tpp1xxhmx1VZbLbenjBYtWsR//vOf6NOnT9pxb86cOfGb3/wmBg0aFCeffHLsvvvu0b1794x1LVq0KCZOnBjjx4+PJ598Mh5++OFaH6Ymkw8++CBOPPHEOOWUU2L77bePffbZJ3r16hUbbrhhNG7cOON8b731Vtx6661x3XXXJQ4/sNlmm5VNl/jFtE+Uqvnz58fgwYNj8ODBsdpqq8V+++0XO+64Y2y22WZVDg01c+bMePzxx+Pyyy+PV155JfEzmXp+W1aTJk1+3k+X9fe//z3eeeed+Otf/5o4zMecOXNi+PDhcckll8TLL7/8c3nHjh2jbdu2ee3tarEdd9wxnn766YiImDFjRuyyyy5xxBFHxCmnnJK4rXzwwQdxww03xNVXXx0LFy5MrPOGG26IZs2a5T3WbJxwwglx//33x3PPPbdU+aJFi+Koo46K4cOHxwUXXBDrrrvuUtNTqVQ8++yz8fvf/z7jNnDeeefFBhtsUO3Ybrzxxhg9evRyP5epR41BgwYl9kC3rGw+U0pWXHHFGD58eOywww6JvbHMmDEjjjvuuLjiiivi2GOPjX322Se6dOmSWFcqlYoJEybEPffcEzfddFNMnjw543IPOOCAjL1wlKLWrVvHM888EzvvvHNi72lz586NP//5z3HVVVfFAQccEPvvv39ss802ib1HLbZgwYJ47bXX4umnn46777473njjjVr8BoW1aNGiuP322+P222+PtddeOw444IDYbrvtYpNNNolVVlmlynm/++67GDlyZAwZMiQef/zxxF4VI366Jr/jjjuqvC5a1gEHHBBffvll4rS11147hgwZkteeDY8++uj4xS9+kZe6Mu1fO+64Y3Tu3Dkvy0jy7bffxoEHHpjxd+jcuXOcf/75eV1mVffvy1p55ZXj3HPPjXPOOSdt2vz58+OMM86Iu+++O84666zYbbfdEu/LFyxYEGPGjImrr766yh4n99hjj4y9YAEAlKKKVKYrHwCAMjJ37txo06ZN/PDDDz+XbbzxxvHaa69VOd/VV18dp59++lJld9xxR+KDyVIwfvz42GqrrWLevHnVmv+TTz6psiFy7ty5seuuu1aZNFJZWRkbbLBBrL766tGqVav4+uuvY+LEifH5559Xuex//OMfccIJJ+Qc88KFC2PrrbeOl156Ked5I356UJxpHPsDDjgg7r///ozzNm7cODbZZJNYffXVo3HjxvHdd9/Fp59+mjimfUVFRdx5553xxBNPxG233bbUtE6dOsWkSZOyjrlz587x6aefLlU2YMCAonwYNm7cuNhqq62W+7k11lgjJk2alHUSSjbOPffc+Otf/1rlZ9Zaa61Ye+21o3379jF16tT47LPP4p133qlynoMOOijuuuuuxMS1JT333HOxww47pD08btCgQTzzzDPVSvD77W9/G1deeWVaeZcuXWL8+PHRsmXL5dYxduzY2GOPPTIOd7FY+/bto1u3btG2bdto2bJlzJkzJ6ZPnx5Tp06NDz74IGbPnp1x3l122SUx2ShJ0nqsar9c7MILL4yLLroo4/TGjRtH9+7do127dtG2bdto3rx5zJkzJ7777rt477334rvvvss4b9OmTeOVV14p2LAf1V0ny1PofWJJI0eOjO233z6tfMSIEUU3xOPyvleHDh2ic+fO0aZNm2jTpk0sWrQoZs6cGR9//HFMnDgx5s+fn3He/v37x+DBg7OOZc6cObHRRhvFxIkTM35m9dVXj/XXXz9WWmmlmDlzZnzzzTfx+uuvpyVMNW7cOIYPHx5//OMf04ba7Nu3b9YJopl+y+HDh8f5558fL774Ytq0tddeO9Zee+1YeeWVY8qUKfHpp58ud4iVs88+OzHhqDqxVXc7+/LLL6NXr17xxRdfZPzMOuusEz169IjmzZvHlClT4rXXXouvv/464+d32223ePTRR2t0/hs4cGDatUVtyLWJMdP6r05dtenbb7+NfffdN8aMGbPcz3bs2DHWWWedWHnllaNp06YxZ86c+Oqrr+Ldd99d7nk1IuK4446Lv/3tb3UyRFrS9WLE8q/3q2vKlClxyCGHxFNPPbXcz1ZUVETnzp2jc+fOsdJKK0WzZs1i3rx5MXPmzPj000/jo48+Shs2OMlpp52W9VB5mY7lhTzvnHbaaXHNNddknN6hQ4fo1KlTtGrVKlq3bh2NGjWKGTNmxIwZM+LDDz/MmBSzpGbNmsUDDzwQu+22W06xZdp+asstt9wSAwcOrHE9P/74Y6y66qqJ++M999wTBx54YI2XkcmkSZNirbXWqrX6k+S6P6dSqejfv3/ccccdVX6uYcOG0bNnz+jYsWO0bt06Zs2aFZMnT44JEyZUeQ8QEdGzZ8947rnnolWrVlnHBQBQ9ArXyQ4AQN157rnnqtXdeNLQRP/9739rP+BadP3116cqKyuXO9RD0l823W3PmjUrtfPOO1er/qS/Bg0apP7+97/X6Dt/8sknGYeiWN5fVUO2zJgxI7Xhhhvm5Xv+3//9XyqVSqUGDBiQNq1ch5daLNNwNEv+nX/++bWy7HPPPTdv22pEpA477LDU/Pnzl7vcb7/9NmOX/BdffHG1v8+8efNSvXv3Tqz3gAMOyLqeqoYJysdfXQ4vle+/Vq1apUaNGpV1/LWhuuskG4XaJ5ZVasNL1cbfQQcdlNNQH4uNHTs24zCN2f41atQo9cADD6RSqeQhh/IxvNSIESNSX3/9dWrttdeu8bo66qijqjWsV21sZx988EFq9dVXz8s28Mtf/jKn4bIySbq2qI2/XD3wwAOJ9XTp0qXG3znf5s2blzr99NOrfQ29vL+WLVumbr755jr9TnU1vNSSFi1alBo0aFCqWbNmtbotNmnSJHXaaaelJk+enHVsmeoq9PBStbmeunXrlho3bly1Ysu0/dTW3y233JKXdXr77bcn1t+uXbtqnXNz8cknn9TpOqvu/jxv3rzU/vvvXyvxbLjhhqkvv/wy/ysXAKDA8veaKABAEUt6G3t5vUikUql4/vnnlyrr2rVrlcNElIJjjz02Ro4cGRtttFGt1N+iRYt47LHH4g9/+EM0atSoRnV17tw5nnrqqTjxxBNrXM8bb7wRhx9+eE7dpi/PiiuuGE899VRsu+221a5jhRVWiDvuuCPOOOOMvMVVao444ogqp1dUVCz3M9V1ySWXxL333hsrr7xyjepp0aJFXHvttTFkyJDlvp2+aNGiOOywwxLfPt5pp52yHkomSaNGjeLuu++ONm3apE2777774h//+EdW9fTo0SNeffXV+O1vf5vXfSYiYrXVVotf/epXea0zSb7jjojYeuutY8yYMTXa54tdIfaJUlfTc92ymjdvHn/5y1/izjvvrNZ23Lt37xg+fHjicSAb7du3j+HDh8e+++5brflzscoqq8SYMWMSh7zKRoMGDeLiiy+OG2+8MaeelGpTt27d4pVXXsnYg0s2Kioq4tRTT40nnniiYMNl1YVle1BaLN/Dq+RDo0aN4sorr4xx48bFNttsk7d6GzRoEL/+9a/j3XffrbVrnWJSUVERZ599drz77rtx6KGH5v380KRJkxgwYEC8//77cdVVV8VKK62U1/rrWm0d1xo3bhx/+MMf4s0334xevXrVyjKKVaahpfr3718r146lqFGjRnHffffFTTfdlFUvmdmorKyMM888M15++eXo2LFjXuoEACgmkm4AgHph2aSbioqK5T40feutt+L7779fqqzYhrSorj59+sSECRPi1VdfjYsvvjj233//WG+99aJDhw7RokWLGjfwNmjQIP70pz/FG2+8Ua0GzI4dO8agQYPirbfeih122KFGsSzWtm3buO222+LLL7+Mf/3rX3HMMcdEr169YvXVV4/WrVtXu9G/Q4cO8cwzz8Sll14a7du3z3q+xo0bR//+/X9+6FCf9e/fPxo0aJBx+rbbbhtrr712rS3/gAMOiPfeey/OO++8aNu2bU7zNm/ePI4//vh499134+STT85qnr/85S+JQyt07Ngxbr/99hoPodWpU6e47bbbEvfj3/72tzF+/Pis6mnevHlcccUV8f7778fpp59eowdXnTp1iqOOOiqeeuqp+Oyzz2qcSJeNc889N1577bW4+OKLY6uttqpRYsTWW28dd9xxR4wePbpgQ0rVpbreJ0rdd999F/fcc0/079+/Rg+SVlpppTjhhBPi/fffj3POOadGx4LevXvHW2+9FUceeWSVx9clNW7cOH7zm9/EO++8U63h7aqrQ4cOMWbMmLj88stzSvbq27dvjBs3rigTNFZZZZV49tlnY8iQIbHuuuvmNO+OO+4YY8eOjauvvrrsE9aSkuK7dOkShx12WN0Hk6UtttgiRo8eHaNGjYpDDjkkWrRoUa16VllllTjllFPivffei9tvv73kk/pz1alTp7jjjjvio48+inPPPTe6detWo/q22WabuP766+Prr7+OW2+9NTp16pSnSAvrL3/5Szz22GNx8sknxzrrrFPj+jbccMO44oor4rPPPos//elP0aRJkzxEWTo++uijjMl+Rx99dB1HU/yOPPLI+PDDD+OSSy6p9j7VsmXLOPHEE+PNN9+Myy+/vN5tcwBA/VGRShXRIMkAALXksssuizlz5vz8/1atWsXpp59e5TxvvPFG/Oc//1mqbI899ogtttiiVmIsZ1OnTo1HHnkknnvuuXjjjTfi008/jenTp8f8+fOjWbNmsfLKK0eXLl1i8803j5122im22267rB8SFpMffvghHnrooXj22WfjxRdfjG+//TamTJkSFRUVseKKK8aaa64ZPXr0iO222y5+9atfJSbpTJ48OWbNmrVUWcOGDWP11Vevq69Rr82bNy+eeuqpePbZZ2P8+PHx8ccfx/fffx8//vhjNG7cONq0aRNrrbVW9OzZM7bffvvYY489qv3ArdQsXLgwnn/++Xjuuedi/Pjx8dFHH8WXX34Zs2fPjgULFkSLFi1ixRVXjNatW0eXLl1inXXWiR49ekSfPn2iS5cuhQ4/fvzxx3jllVfixRdfjPfeey8+/vjjmDRpUkyfPj1mzZoVCxcujBVXXDFatmwZHTt2jJ49e8Ymm2wSu+yyS6y11lqFDn8pkyZNSitr3bp1tG7dOu/Lsk/kbtKkSTFu3Lh47bXX4qOPPoqPP/44vv7665g1a1bMmTMnmjRpEi1btozWrVtH9+7dY+ONN45evXrFTjvtlPdecxbH8+ijj8ZTTz0VH374YXz33Xcxffr0aNasWXTo0CE22GCD+OUvfxn7779/rLLKKnlffi5++OGHGDZsWDz++OMxYcKEmDRpUsycOTMqKiqibdu2sc4660SfPn1i//33z0uPfSNHjkzskWbkyJF5SzxKpVIxevToGDZsWLz88svxwQcfxJQpU+LHH3+MFi1axCqrrBLrrbde/OIXv4i99947Lw/WS8H3338fK6+8cizbLHnzzTeXVI8vs2fPjtGjR8eYMWPi9ddfj48//ji++uqrmD17dsybNy+aNm0aK6ywQqyxxhrRpUuX2HTTTaNPnz7Rq1evkrzWrU3vvfdejBkzJl5++eWYOHFifPrpp/H999/HnDlzYsGCBdGyZcto06ZNtGnTJlZfffXYbLPNYosttogtttii5Hu0ydbUqVPjpZdeildffTU+/PDD+OSTT+Lzzz+PGTNmxKxZs2L+/Pk/X8u0bNkyOnToEBtvvHFsuummsdlmm0X37t0L/RUoUYsWLYqXXnopXnzxxZ+vpadOnRrTpk2LmTNnRrNmzX6+Fl1rrbViiy22iF69esU222xT768LAYD6QdINAAAAAPXO8OHDY+edd04rHzt2bPTu3bsAEdUf//nPf2K//fZbqqxLly7x3nvvlX0PPwAAAJQXw0sBAAAAUO/88MMPieUrrrhiHUdS/yQNLXXeeedJuAEAAKDkSLoBAAAAoN6ZPHlyYnnLli3rOJL6Z8SIEUv9f+21147+/fsXKBoAAACoPkk3AAAAANQ7H3/8cVpZkyZNomPHjgWIpv6YPHlyvP3220uV6eUGAACAUiXpBgAAAIB65/nnn08r69Gjh+SPWjZy5MhIpVI//3+ttdaKww8/vIARAQAAQPVJugEAAACgXnnnnXdizJgxaeVbbrllAaKpX0aOHLnU//VyAwAAQCmrSC35agkAAAAAlLHRo0fH4YcfHp988knatFGjRsW2225bgKgAAACAUiTpBgAAAICyNHny5DjzzDNj4cKFMW3atHjzzTfj008/TfzsuuuuG++8805UVFTUcZQAAABAqZJ0AwAAAEBZmjRpUqy11lrL/VxFRUWMGjUq+vTpUwdRAQAAAOWistABAAAAAEChVFZWxjXXXCPhBgAAAMiZpBsAAAAA6qV11lknHn744Tj55JMLHQoAAABQghoWOgAAqI8G9Bvy879vG9q/gJEAAED90LRp02jbtm107Ngxttpqq9hpp51izz33jMpK76QBAAAA1SPpBgAAAICy1Llz50ilUoUOAwAAAChTFSktDwBQZ5bs4WZJersBAAAAAACA0iLpBgBqUaYkm0wk3wAAAAAAAEBpkHQDALUg12SbZUm+AQAAAAAAgOJWWegAAIClSbgBAAAAAACA4tew0AEAAEtbspccCTgAAAAAAABQnCTdAEAe1XRYKQAAAAAAAKA0SLoBgGqSYAMAAAAAAAD1V2WhAwAAAAAAAAAAgFJTkUqlUoUOAgBKRSF6t7ltaP86XyYAAAAAAABQNUk3AJCFQg8lJfEGAAAAAAAAiovhpQBgOQqdcFMsMQAAAAAAAAD/07DQAQBAMZHcAgAAAAAAAGTD8FIAEKWTbGOYKQAAAAAAACgOeroBoF4rlWQbAAAAAAAAoLjo6QaAeqvUE270egMAAAAAAACFI+kGgHql1BNtMpGAAwAAAAAAAHXL8FIAUAaWTCaSgAMAAAAAAAC1T083AJS9cu3dJluScAAAAAAAACD/KgsdAABQu+p70hEAAAAAAADUBkk3AJQ1CScAAAAAQKnSvgkAxc3wUgCUDTegVTPMFAAAAAAUr6raN7XtAUBx0tMNACVvQL8hEm6yYB0BAAAAAABA/ki6AQAAAAAAgCLmhToAKE6GlwKgJLnJrBnd0QIAAABAccm2zVPbHgAUDz3dAEA9JGkJAAAAAIpHLu112vYAoHjo6QaAkuOmMn+8FQMAAAAAhVfTNk/tfABQGJJuACgZkm1qhxtyAAAAACicfLZ7ausDgLol6QaAoibRpm64GQcAAACA2jWg35Cl2uFqs+1Tex8A1A1JNwAULQk3dcuNOAAAAADkV6HaOLX1AUDdqCx0AACQRMJNYVjvRPy0HdgWAAAAAHKjPQUA6p+GhQ4AAJbkxrRwrHuWtXib8GYUAAAAQNUWt6NoYwOA+sXwUgAUDTekxUOSRf2VtB/aHgAAAADSlUJ7pnYdAKhderoBoOBK4ea0vtHDSf1iHwQAAIDCGtBvyFLtMMv+n+KiLQUAWEzSDQCQ0ZINCBp66i/bAQAAANS+ZRM5vBRVOJJqAIBsSboBoCDcuJYeiRflKdd90Zt2AAAAQDnTbgkA5KIilUqlCh0EAPWHm9bykU3ihQSN4laT/dHvCgAAAPmzvHt09+H5t2S7VX1os7QNAUDtkHQDQK2rDzetVM1NfXHJxz7pNwUAAID8yOU+vVjvx4v5xSttk+mK9bcCgFJkeCkAapWbWiLStwM39nXLfggAAAClr1jbUxa3OxSyR11tHwBAoUi6AaDWuNklk0zbRrE2HpWy2toP/YYAAABQPJa8T6/Le/N8tTtoRwQASpXhpQCoFW6UqQsSPKpW1/uh3wMAAACyV5379kz33lXVlcv9etIwUdr5yo82HADIH0k3AOSVm3AKpb42FixuDCuGfa++/gYAAABQXflIvMm2jqru24uhXYG6pR0HAPJD0g0AeePmnFJSig0LpbCPleJ6BQAAgEIphXt9ypM2HADID0k3AOSFBgJKWb4aGZK6YK7J55adp5RouAEAAIDMSu0+n/Kk/QYAaq5hoQMAoPRpJKDU1bQb5iXnr439wT4GAAAA5aE6L+IAAFC89HQDQI1IBoCaK8cx1TUgAgAAQLJSvdenPGnDAYCa0dMNANWicQDyx/4EAAAAAABQeiTdAJAzCQLA8izZXbauswEAAKjPtKUBAJQvSTcA5EQjAZAtxwsAAAAAAKCcSboBIGseoAMAAABA1bShUUr0UAwANSPpBoDl0lAA1NTi44hGHAAAAMqZdjQAgPqlstABAFDcNBQA+TSg3xDHFQAAAAAAoCzo6QaARB6KA7VJ18UAAACUE21pAAD1U0UqlUoVOggAiocGAqCuSb4BAACgVGlLo1xonwGA6tHTDQA/00gAFELSsUdDDwAAAAAAUOz0dANAREi4AYqT5BsAAACKzZJDJmtToxxpjwGA7Em6AUDjAFASNPgAAABQDLSlUR9ohwGA7Ei6AajHNBAApUijDwAAAIWkTY36QhsMACyfpBuAekrjAFAuNAABAABQF7SnUZ9pfwGAZA0LHQAAdU8DAQAAAAAA2Vq2TVkSDgD8pLLQAQBQ+5a8IZJwA5SbAf2GOLYBAAAA1CFtMQDwEz3dAJShpBseN0EAAAAAAAAA+VORSqVShQ4CgPyQWAPUd7o2BgAAoDZod4Nk2mIAqO/0dANQJtz4AwAAAABQl5Zsl5aAA0B9VFnoAAAAIF8kIAIAAAAUxoB+Q7TNAFDv6OkGoIS5gQEAAACA2qUNDrKntxsA6hs93QAAAAAAACSQcAO50dsNAPWNpBuAEuXGBQAAAACAYqT9GoD6QtINQAlywwKQmWMkAAAA+eD+EmrGPgRAfSDpBgAAAAAA4P8zPA7kj30JgHIn6QagxLhJAVg+x0oAAAAAAKC2SboBAKDs3Da0f6FDAAAAAAAAypykG4ASoucGAAAAAKg92t8AAMiFpBuAEuGGHwAAAAAAAKB4VKRSqVShgwCgahJuAHJniCkAAAByoQ0Oape2GgDKkZ5uAIqcm30AAAAAqF3a4AAAqA5JNwAAAAAAQL0l4QYAgOqSdANQxNzwA1SfYygAAAAAAFCbJN0AFKEB/YZ4WAwAAAAAQNnQ5g1AOZJ0A1BEJNsAAAAAQN3RFgd1yz4HQLlpWOgAAPiJmw0AAAAAAMrdkm3htw3tX8BIAKDm9HQDUGB6twGoPY6vAAAAAMVJwg0A5UBPNwAF4kEwAAAAAAD1lR5vACgHeroBKAAJNwAAAAAAAAClTU83AAAAAABAvePFOCgey+6Per4BoFRIugGoY27mAQAAAKBwtM9B8ZOEA0CpMLwUQB0Z0G+IG3oAAAAAAMiRtnUAipWebgBqkRsBAAAAAACouSXb2/V8A0Cx0NMNQC2RcANQHByPAQAAAMqL9h4AioWebgAAAAAAAICSsmzijd5vACgEPd0A1AJZ9gDFxXEZAAAAoLxp/wGgEPR0A5BnLuwBAAAAoDhpu4PytuQ+rucbAOqCnm4A8shNO0DxcowGAAAAAADySdINQJ54mAtQ3LzdBAAAUL9pv4P6xT4PQF2QdAOQBy7eAQAAAACguAzoN0T7PQC1qmGhAyhHSSdvb1ZD+XLBDgAAAADFTRse1G8D+g3xrA6AWlGRSqVShQ6i3Czv4t1JHcqHm3WA0uI6DAAAoP7Rhgcspm0IgHyTdJNnuVy8O7FDaXOzDlC6XIcBAADUD9rwgGVpFwIgnyTd5ElNLtyd3KH0uFkHKG2uvwAAAMqfNjwgG9qJAKgJSTd5kM8Ldyd2KH5u1gHKg+suAACA8qYdD8iFtiIAqkPSTZ7U1sW7EzwUFzfqAOXDdRYAAED50o4HVIf2IgByVVnoAKjagH5Dfv4DCst+CFBeHNcBAAAAWJL2IgBypaebPCiWE3A+sm8H9BuSVk9SGdQ3xbKfA5BfrnEAAADKj7Y8IF+0HQGwPJJu8qDYLuCrugDIZ6wuNKgvim0fByC/XNMAAACUD215QL5pOwKgKoaXqqFivIBfdjiqxf/Od6yGvaI+sI0DAAAAQGnQlgfUBscWAKqip5sacqL9H5m+lBv7N0D94ToGAACgtGnLA+qKdiQAlqSnG/LGTQ3lxPYMAAAAAAAsy/MDAJakp5sacFJNJsOXUmffBqifXMMAAACUJu15QKFpVwKov/R0U00u4jMb0G+I9UPJsu0CAAAAAAAAkA093eTIA/nqkeFLsbNvA+B6BQAAoLRo0wOKibYlgPqpYaEDKDW3De3vQr4allxnLjooJvZnAAAAAAAAAKrD8FLUOcNPUSxshwAAAABQmrTtAQBQDCTd5MiFfP5YlxSKxC8Akjg3AAAAAFBd2pYA6ifDS1FQy7sAMRQV+eaiF4BMXHcAAAAAUBMD+g3RxgRQz1SkUqlUoYMoFR7WF5aLFGrKPgxAVVxrAAAAlAbtfECx084EUH/o6SZLLuILL+k3cNFCNuy/AAAAAABAXVn2uYTnWQDlS083y+FhfWlx0cKS7L8A5Mq1BAAAQGnQ9geUEm1OAOWrstABQD4N6DfEzRYR4aYbgOpx/gAAAAAg37Q5AZQvPd1UwQmw9Mkcrn/stwDkg2sIAACA4qT9Dyhl2pwAyk/DQgcAkA9utgEAAAAAgGK2+FmG5BuA8qGnmww8wC8vLl7Kl30VgNri+gEAAKA4aRMEyoG2J8i/bK8Rltz/BvQbYn+kRvR0A5QsN9cAAAAAAEAp0usNpWrZJJVcn9fVZJvP17PBZetZ9v/2S3Khp5tleIhffzl4lg77KQB1xfUBAABA8dE+CJQbbVCUinycg7Pd3pdM7in0ud8+SlUk3Syj0Dssxc9Bte7ZLwEoJOd+AACA4qK9EChH2qAodrV9/l12Hyi2831V+2hS7z/26fpD0s0yim3npTg5SNYd+yQAhea8DwAAUFy0GQLlTFsUxci5t/rs0+WvstABFBMHC3Jlm6ld1i8AxcD5CAAAAIC6oi2KYmObrJkB/YYs9Uf50dPNEmzk5JvMxdzZDwEoVs7rAAAAxUEbIlAfaIui0Jxva4d9u/zo6eb/c9CgNshazI31BAAAAABURRsiUF843lFItj/IXsNCBwD1RaaT07LZjAP6DalXGY5O2gCUivp2jgYAAACgsLRHUVc8r4Pq09MNFNiSJ7HF/y73E5segAAAAAAAAJbPsxRqk+d1UHMVqVQqVeggCs2BhFJRytnM9jMAykUpn48BAABKnXZGoL7SJkW+OacWjv25vBheCkrIkie/5Q1LVeguB52oAQAAAIB80uYI1GeFfu5DeXFOhfzR083/58AC/5Ppos1+AgA/0cABAABQ97RPAmiXIjdJyVrOp4VnPy4vkm7+PwcXAABy4cYIAACg7mjDB/gf7VIsj/NmcbMPlxfDS4WDDgAAAAAAFCtt+ABLW3xc9OC+9C3bE82S57zl9VCjBxsoDpWFDgAAAEqRm1gAAIDa594LIDPHyNK07O+W6XdcsjzpMwP6DVnqj9Lh9yovhpcKGzUAANXjbSIAAIDao+0eIDvaqEqD8xpLst+Wj3qfdOPgBgBATbg5AgAAyD9t9wC5005VfJzPyMT+Wj4k3TjQAQCQB26SAAAA8kO7PUD1aaMqDOcuqsP+Wh4qCx0AAAAAAABAhIeWADXlOFr3rHOo3+p1TzcOgAAA5JM3EwAAAKpPmz1Afmmrqh3OV+ST/bT06ekGAAAAAAAAoMxIDsk/6xRYVsNCB1AoDogAAAAAAFActNkD1I7Fx1e9aeTGeYm6YL8sD3q6AQCAPHCDBAAAAECxkkSSnQH9hlhX1BnbWnmolz3d2HgBAAAAAKA4aLMHqBt6vcnMuYhCsC+Wh3qZdAMAAAAAABSeh5wAda++J9849wD5VO+Gl3IQBQCgNrjOBAAAAKCU1Lf2LENHUWxsj+WhXvV0Y6MFAAAAAIDioM0eoPDKudcb5xmKXTnud/VRvUq6AQAAAAAAAGBpA/oNKYsEAIk2QF2rSKVSqUIHURccYAEAqAvl0DgBAABQ27TZAxS3Umvjcl6hFJXafkaysu/pxgEWAAAAAAAAIHvFPOyU57+Ui3LpYaq+K+uebhxwAQAoBDdKAAAAmWm7ByhNddnm5VxBfaEtufSVbU83DsQAAAAAAFBctN0DlK5lj+HZJAs47gPlrmyTbgAAAAAAgMIxZAJAeZNQAzXneqn0lV3SjYM7AAAAAAAU1uK2em32AACUs7JLugEAAAAAAApDkg0AAPVJZaEDAAAAAAAAAACAUiPpBgAA8sybnQAAQH3kXggAgPqmLIaXciEPAAAAAAAAAJSaAf2GxG1D+xc6DKpJTzcAAAAAAAAAAJCjkk+60csNAADFyHUqAAAAAACUt5JPugEAAAAAAArLiwcAANRHJZ104yIeAAAAAAAAAIBCKOmkGwAAAAAAAACAUqbDkdJVskk3NjoAAIqda1YAAAAAALKhPbk0lWzSDQAAAABQ/JIajgf0G/LzXzafB4rfbUP7FzoEAICS536o9FSkUqlUoYPIlQ0NAIBSoeEZAChHmdrnFl/7DOg3ZKl/5yqpnmyWX1VdVVmyPtdvkD/a8gEAqsd9SemQdAMAALXIzREAUA5qmkRTylzPQfXVt+MFAEA+uAcpLYaXAgAAAACWUtWQUPVNff3eAAAALF/DQgeQKze4AAAAALB8mYZmymV+/mfx+vDWKQAAAIuV3PBSbvYBACg1HswAAIWwZJJINgkj2t1y4xoPsuPYAgCQO/cbpaOkerpxcQ4AAAAAuVmyTW3Z5BvtbdWn5xsAAAAqCx0AAACUOw+zAIBiM6DfENcoeWJdAgAA+SSxv7SUTNKNG1cAAAAAoFhpvwQAAPLBvUVpKYmkGxsVAAClzjUtAED50+sNAABQU3q6KS0lkXRjowIAAACA3GhTKxzJN/AT+wEAAOWuJJJuAAAAAABKTabkG4kI1Ae2cwCA6nEdVVoaFjoAAAAAAIBylm3ijd6JKBceFAEA1MyAfkPcH5QISTcAAFBH3CgBAFCVqhIVXEcCAED9oj25NJTE8FKy4gEAAACA+mzxUFXaSil2tlEAgPxxbVX8SiLpBgAAAACAn0i+AQCA+sP1f3GTdAMAAHXIzREAAPmi9xsAAKg/XPcXJ0k3AAAAAFCmbhvav9AhUEc0wAMAQPmTdF98ij7pxgYDAEC5cY0LAEBt0ABPodn+AACobxoWOoCquEAHAAAAgOrRtlZ/Lfnb6+0IAADKz4B+Q1zrF4mi7+kGAAAAAIDqkXxFXbGtAQDULT1dFoeKVCqVKnQQSWwcAACUM28hQM0k3TParwDSaWNjMedJapvjDQBA4bjeL5yi6+lGNhYAAED9tOS9oPtCAMgv51Zqk+0LAKCwXI8VTlH1dGNDAACgPvH2ASw9/nS+7gntWwD/o72NJM6V5JPjDABA8XCtX/eKKukmwgU6AAD1hxsg6qO6vueznwH1mXY2quIcST44zgAAFCfX+3Wn6IaX8uMDAFBfaKCmPinUUML2MwBI5hwJAABQc0WXdAMAAED5KFSyzbIxVDWtGGIEgEJwDqQmbDsAAMXLtVrdKarhpfzwAADUN3p6pFyV2v2dfREoN6V2HKbwnAvJleMMAEBpcK1fuxoWOgAAAKjPBvQb4qaHsuChCwAAAAAUH23QtauohpfyQwMAAFDX3IsCgARaAACA6iiqpBsAAKiPPOCgWNTXbbG+fm+gfDmuUV0D+g35+Q+qYhsBACgtrt9qj+GlAAAA6oElu5Fd8iZ72bLl3YAv2ytMudyw62YXAJbm3AgAAOXFNX7tqEilUqlCB7GkcmmwBQCAXLnhoba4z8qOfRAoB4751KWaJOM675YuxxkAgNLlOjz/iirpxsU6AAD1nZse8sG9Ve7se0Cpc+yn3Dg3FyfHGgCA0udaO7+KKukmwkU7AAD1mxseasL9VPXZ94BS5vhPuXOeLg6ONQAA5cM1dv40LHQAAADA/xhXl8U81ACgKs4T1CeukQvPMQcAAJJVFjoAAABgaRq0668B/Yb8/Efdss4BoLg5VwMAQP64vs6fohpeyg8LAABL80Zv/eKeqLDsb0CpcL6A/3H+rn2OOQAA5cv1dM3p6QYAAKAIeJhRWBoYAKA0uYaqXdYvAEB5c71Xc0XT040fEwAAkkkGKG/uhYqD/QwoFc4bsHzO6/nheAMAUH+4hq6+giTduFgHAIDcuOkpL+6JipP9DCgFziGQHef1mnGsAQCof1xDV0+dDy/lYh0AAHLnOhoAcD0A2bO/VJ91BwBQP7kOrJ46T7oBAACqx00P1C77GACUF+f23AzoN8Q6AwCo51wP5q5hoQMAAACoD9ywloYB/YboShcAykimazDnewAASKZ9LDd12tONRmYAAKgZ19Slye8GQE3ofQKobY4xAAAsyfVh9ipSqVSqrhbmhwEAgPzyxkFxcw9UuuxbQLFwLoG6U1/P/44zAABkUl+vkXNRZz3duHAHAACgVLiHBYqBYxHUrfrWq1R9+74AAOTO9eLy1VnSjQwoAACgvvAAA4Cach6BwqkP+199+I4AAOSHts6qNSx0AAAAQPUN6DdEgjsAlBENmVAclt0Xy+ma23EGAIDq0BadrM56ugEAAIBS4oEUUNccd6B4lcPbveXwHQAAKCzXk+kk3QAAQIlzowO1x/4F1BXHGygNixNXSm2fLbV4AQAoXq4tlybpBgAAII/cdJYfvylQ2xxnoDSVQvJNKcQIAEDpcY35P3WadGN8LwAAqB1ucoqD36F8+W0hP+xL6awTKH3FmNhSjDEBAEA5qkilUqm6XKALfQAAqB2S3AvP/U75s59Bbqo6Ltbn/cn5AspboY5vji0AANS1+nxvv1idDy9lpQMAAOVk8VvEHnIALM1xMZn1AuWvENeGji0AABSC69ACJN0AAAC1ww1O3bGu6y+/PeRPfdufJGhC/VMX+71jCwAAFFadDy+1mBsBAADIPz1L1j73MizLfgfpsj1Wlvv+45wBZFLd45/jCgAAxajc7++r0rDQAQAAAJQKDzlIMqDfkHrdsAA1sfi4ah8C6hvXlQAAlJP63D5WsJ5uItxYAABAbaivNze1xX0Ly2Ofg6VV97hZbvuS8wcAAAD1Tbnd22dDTzcAAABQA/X5TR5YUn1PMqnv3x8AAADqYztZQXu6WUyjBAAA5Fd9u7HJN/coVIf9jvoqn8fMYtuPkhoLnSMAAAAgs2K7t69tkm4AAKAM1bcbm3xyf0JN2PeoT2r7eLnk/lRXb8o5BwAAAEDN1ac2sqJIuonQqAEAAPlWn25sasr9CLXBPki5K8SxM2m/yldCjnMBAAAA5Ed9ahdrWOgAAAAACslDVoDSkemYvWx5ro17zgUAAACQP3XVY20x0NMNAACUsfpyY1MT7kWoTfZBylmxHz+X3f+KPV4AAAAoN/WhbUzSDQAAlLH6cFNTE+5DqCv2RcqN4ycAAACQjXJvFyuapJvFNNoAAED+lPsNTU25/6BQ7JuUMsdOAAAAIBfl3BZWWegAAACA2uPBaGbWDUBuBvQb4tgJAAAA5Kyc2xOKKummnFc0AAAAQKnSZgMAAADURLm2LTQsdAAAAABQ3yzZyFDO3etSHsq1UQwAAACoW4vbGMqpPayoeroBAADyz8PSpRkeBQAAAACgcMqpfVbSDQAAUG+U080c5aMutkvbPtUhSREAAACoLeXS5lA0STflskIBAAAgV5IbKCa2RQAAAIDsFEXSjcYcAACgtrnvoL5avO3bB8iF7QUAAACobeXQ/lAUSTcAAAC1qRxu3gDqguMlAAAAQPYKnnSjMQcAAAB+sniYqXzdK7vnJle3De1f6BAAAACAeqTU268KnnQDAADUvlK/camJ+vzdAQAAAACoPQVNutH4DQAAAMlqes+cNL/7cJbHNgIAAADUtVJujyhY0k0przQAAChFrsGh9FRnv812eCrHBAAAAACKRam2VTUsdAAAAABAZgP6DYnbhvbP6nPZ1gdJbBsAAABAIS1um8imLaxYFKSnG404AABQGPXpWjzb3j6gFGQzVFQpNUZQfBwvAQAAAHKnpxsAAAAoAdkk3kCubEMAAABAscm25+diUJCebgAAgMLxgBVYzPEAAAAAAKpP0g0AAABAPSTpCgAAAChWpdJuUedJN6WyYgAAoJy5LgcWG9BviGMCAAAAAFRDnSbdaMQDAABqmwQCqB77DQAAAADFpBTaqwwvBQAA9VQp3LAAdee2of0LHQJ1yDkAAAAAKAXF3oZRZ0k3xb4iAAAAAOoDbTQAAAAA+aGnGwAAAIB6QsINAAAAUGqKuT2jTpJuinkFAAAA5cO9B1Sf/af8+Y0BAACAUjWg35CibNuoSKVSqdpeSDF+cQAA4Ce3De1f6BDywn0H5E+5HBf4H8dIAAAAoJwUS/tVw0IHAAAAUBMeJEP+Deg3pGgaLqgZx0gAAACgHC3Z5lHIdqw6GV4KAAAoXh7IAkkcG0qf3xAAAACoDwo59JSkGwAAoGQfzJZq3FAq7GOlTW9FAAAAQH1SiLasilQqlarNBWigAwCA0lEqD2jdZ0DdKZXjAukcKwEAAID6qq7atGo96SZCIw8AAJSSUnjA7h4D6l4pHBv4iWMkAAAAwE9qu02rYa3WDgAAlJwB/YYUxcN1D40BcufYCQAAAFB3JN0AAABpFj+0XZx8k+khbq7JOR4GA9QOx1cAAACAuifpBgAAyGh5D3E95AUoPMdiAAAAgMKoLHQAAAAAAFSPhBsAAACAwpF0AwAAACyX5A4AAAAASk1tt2nVetKNRjkAAACA/NPmAgAAAFBYtZ50c9vQ/nHb0P61vRgAAACAekPCDQAAAEB2arMdxfBSAAAAAAAAAACQI0k3AAAAACVELzcAAAAAxUHSDQAAAJAVyR4AAAAAlJrbhvavtbrrJOlGoxwAAAAAAAAAAOVETzcAAAAAAAAAAJSl2uwoRtINAAAAkDW92QIAAADAT2o96UZjHAAAAAAAAAAAhVJbuSt6ugEAAABy4gUbAAAAAErNgH5D8t6uJekGAAAAyFltNFKwfNY5AAAAQPXdNrR/XuuTdAMAAABUmyQQAAAAAOorSTcAAABAjUi8qRvWMwAAAEDNGF4KAAAAKDqGmwIAAACgvqn1pJt8j4cFAAAAUN9IaAIAAADIj3y2s+jpBgAAAMgbySEAAAAAFLt8tWFJugEAAADySuINAAAAAPWBpBsAAAAAAAAAAOqVfLw4VutJN95uAwAAgPpHewAAAAAA5U5PNwAAAECtGNBviOQbAAAAAIpWTduuGuYpDgAAAIBEyzZe3Da0f4EiAQAAAIClDeg3pNrtVbXa04232QAAAAAAAAAAKEeGlwIAAAAAAAAAgBxJugEAAAAAAAAAgBxJugEAAADqlOGoc2N9AQAAABQnSTcAAABAnZNIkh3rCQAAAKB4SboBAAAAAAAAAIAcSboBAAAACkIvLgAAAACUMkk3AAAAAEVIUhIAAABA3ahuO4ykGwAAAIAidNvQ/oUOAQAAAIAq1FrSjbexAAAAgOXRflA1iTcAAAAAxUtPNwAAAAAAAAAA1FvVffFJ0g0AAABQUHq7ycy6AQAAAChekm4AAACAghvQb4gEEwAAAABKSq0k3WgkAwAAAAAAAACgFFQ3z0VPNwAAAAAAAAAAkCNJNwAAAABFxnBbAAAAAHWrOm0xkm4AAACAoiHRBAAAAIBSIekGAAAAKCr1PfGmvn9/AAAAgFIh6QYAAAAoOvUx8cSQUgAAAAClJe9JNxqHAAAAgHyob20Mtw3tX+gQAAAAAMiBnm4AAAAAAAAAACBHDQsdAAAAAEAmA/oNKfseYOpbjz4AAAAA5SKvPd1oJAIAAAAAAAAAoD7Q0w0AAABQ1MqxtxsvLgEAAACUvrz2dAMAAABQGwb0GyJRBQAAAIBalWv7k6QbAAAAAAAAAADIkaQbAAAAgDqkxx4AAACA8iDpBgAAAKCOSLgBAAAAKB+SbgAAAICSIWkFAAAAgGKRt6QbjV4AAAAAmWk7AQAAACgveroBAAAASkopJq+UYswAAAAA9VEu7TgNazEOAAAAgHpNsg0AAABAabltaP+sP6unGwAAAKCk5NLwUUgSbgAAAADKm6QbAAAAoKQM6Dek6BNaij0+AAAAAGpO0g0AAABAHkm4AQAAAKgfJN0AAAAAJUlyCwAAAAD/r717j60uq+vHv9rpMDOJDmKQ4TYJhq+KyXCJaBAUUxKUXzTT9PuLCWBSWoWoBAwOGrmOQ0AJXkg04aYjpk0TvoMSaRqHDEFio0SiAZxEEy5RIChxUGNgZMDf8H26f388PX1OT89pzz5n771ur1fy5Gl7bqv7nO699vq891oxdRa6yWU9dQAAAIC+CAIBAAAA5Ktt9sVMNwAAAEC2Ugq5pNQWAAAAAPondAMAAABkTdgFAAAAgBiEbgAAAIDsxQ7exH59AAAAAJbXdoyns9CNwSUAAAAAAAAAAHK1d7DV6v5mugEAAACKEOuCIBciAQAAANRJ6AYAAAAAAAAAAFoSugEAAACKMfSsM2a5AQAAAKiX0A0AAABQFEEYAAAAAIYgdAMAAAAUZ3tzv/fwjXAPAAAAQDn2DrZaP0boBgAAACjSIgMlAAAAADAvoRsAAAAAAAAAAGhJ6AYAAAAo0hBLTAEAAABQL6EbAAAAgJaEeQAAAAAQugEAAACKJiADAAAAQB+EbgAAAAAAAAAAoCWhGwAAAKB4ZrsBAAAAoGtCNwAAAEAVBG8AAAAAmGWRsaPOQjd7B1tdPRUAAABALwRvAAAAAOiKmW4AAAAAAAAAAKAloRsAAACgKsvOdmO2HAAAAABCELoBAAAAAAAAAIDWhG4AAAAAAAAAAKAloRsAAACAOVlaCgAAAKBcbcd+hG4AAAAAAAAAAKAloRsAAAAAAAAAAAjtZrsRugEAAAAAAAAAgJaEbgAAAAAAAAAAoCWhGwAAAKA6baYJBgAAAIBphG4AAAAAAAAAAKAloRsAAACgOnsHW7GbAAAAAEDmOgvdmJYZAAAAyIVxDAAAAACWZaYbAAAAAAAAAABoSegGAAAAAAAAAABaEroBAAAAAAAAAICWhG4AAAAAAAAAAKAloRsAAAAAAAAAAGhJ6AYAAAAAAAAAAFoSugEAAAAAAAAAgJY6Cd1sb+538TQAAAAAg9g72Gr9GOMfAAAAAIwz0w0AAADAJQRuAAAAAJgkdAMAAABwib2DrYVmxwEAAACgXEuHblzpBQAAAORmkfEMYyAAAAAAjDPTDQAAAMAlBG4AAAAAmCR0AwAAAHAJS0sBAAAAMEnoBgAAAAAAAAAAWhK6AQAAALiE5aUAAAAAmCR0AwAAAAAAAAAAod0y40I3AAAAAAAAAADQ0tKhmzYJHwAAAAAAAAAAKIGZbgAAAAAAAAAAoCWhGwAAAAAAAAAAaGnp0M325n4X7QAAAAAAAAAAgGwsHbrZO9jqoh0AAAAAg5r3QiIXHAEAAAAwjeWlAAAAAAAAAACoXtuJZ4RuAAAAAAAAAACgpaVDN6ZYBgAAAAAAAAAgZ21nuQnBTDcAAAAAAAAAANDa0qGbRZI+AAAAACkwgy8AAAAAizLTDQAAAAAAAAAAtCR0AwAAAFTNbDcAAAAALKKT0I0lpgAAAAAAAAAAqMla7AYAAAAAxDTrYiIz4AAAAABwEctLAQAAAExhZl8AAAAALiJ0AwAAAFTNjDYAAAAALELoBgAAAAAAAAAAWhK6AQAAAAAAAACAloRuAAAAgKrtHWzFbgIAAAAAGRK6AQAAAAAAAACAljoJ3Wxv7nfxNAAAAADJMN4BAAAAwEXMdAMAAAAAAAAAAC0J3QAAAAAAAAAAQEtrsRsAAAAAkApLSgEAAAAwLzPdAAAAAFXb3tw/DdvsHWxFbg0AAAAAuRC6AQAAAKonbAMAAABAW0I3AAAAACcsLwUAAADAvDoJ3bgaDAAAAAAAAACAmpjpBgAAACCY5QYAAACAdoRuAAAAAAAAAACgpc5CN5aYAgAAAHJllhsAAAAA2jLTDQAAAFA9FxMBAAAA0JbQDQAAAAAAAAAA1Vr0giyhGwAAAAAAAAAAaKmz0I21zwEAAAAAAAAAqEVnoRtrnwMAAAC5cjERAAAAAG1ZXgoAAAAAAAAAAFoSugEAAAAAAAAAgJaEbgAAAIDqWTYbAAAAoE7LjAsJ3QAAAAAEwRsAAACA2iw7HiR0AwAAAAAAAAAALQndAAAAAAAAAABQlS5mPRa6AQAAAAAAAACAloRuAAAAAEII25v7sZsAAAAAwAC6mOUmhI5DN101CgAAAAAAAAAAUmamGwAAAAAAAAAAqtDlhDJCNwAAAADBDL4AAAAAtCN0AwAAAAAAAAAALXUeunFVGAAAAAAAAAAApTPTDQAAAAAAAAAAtLQWuwEAAAAAKdje3I/dBAAAAAB60sfKTWa6AQAAAAAAAACAloRuAAAAAAAAAACgJaEbAAAAgNDPFMMAAAAAlEvoBgAAAKiasA0AAABA2foa/xG6AQAAAAAAAACAloRuAAAAAAAAAACgJaEbAAAAAAAAAABoSegGAAAAAAAAAABaEroBAAAAqrV3sBW7CQAAAABkSugGAAAAAAAAAABaEroBAAAAAAAAAICWhG4AAAAATlhuCgAAAIB5Cd0AAAAAVRKwAQAAAGAZQjcAAAAAAAAAABSpzwuvhG4AAAAAAAAAAKAloRsAAAAAAAAAAIrT9/LiQjcAAAAAAAAAANCS0A0AAABQnYuucur7CigAAAAAyiB0AwAAAAAAAAAALQndAAAAAAAAAABQlCFmMxa6AQAAAAAAAACAloRuAAAAAAAAAACgJaEbAAAAoCpDTC0MAAAAQPmEbgAAAAAAAAAAoKW1rp9we3O/66cEAAAAAAAAAIBLDTnLsZluAAAAAAAAAACgJaEbAAAAgDFm8QUAAABgHkI3AAAAAAAAAADQktANAAAAAAAAAADZ2zvYGvT1hG4AAAAAAAAAAKAloRsAAAAAAAAAALI29Cw3IQjdAAAAAAAAAACQsRiBmxCEbgAAAAAAAAAAoDWhGwAAAAAAAAAAshRrlpsQhG4AAAAAAAAAAKC1zkM3MRNEAAAAABcxbgEAAABAV8x0AwAAAAAAAABAdmJfYCV0AwAAAAAAAAAALQndAAAAAAAAAACQldiz3ITQU+gmhV8MAAAAYJzxCgAAAAC6ZKYbAAAAAAAAAABoSegGAAAAYIwZcQAAAACYh9ANAAAAAAAAAAC0JHQDAAAAAAAAAAAtCd0AAAAAAAAAAEBLQjcAAAAAAAAAANCS0A0AAAAAAAAAALTUW+hm72Crr6cGAAAAAAAAAKBSqWRSzHQDAAAAMCGVgRsAAAAA0iV0AwAAAAAAAAAALQndAAAAAFXY3tyP3QQAAAAAlpTSDMVCNwAAAAAAAAAA0JLQDQAAAFANs90AAAAA0BWhGwAAAAAAAAAAaEnoBgAAAGCKlNYHBwAAACA9vYZuDE4BAAAAAAAAAFCi3me6EbwBAAAAAAAAAKAL25v7sZtwapDlpQRvAAAAgFSkNDADAAAAQL4GCd0AAAAA5MiFRMDI+uFuWD/cjd0MAAAAEjJY6MYgFQAAAACQI2EbAAAApjHTDQAAAADADAI3AAAAzLIWuwEAAAAAKds72Arbm/uxmwEMaFbQ5mhjZ9B2AAAAkDYz3QAAAABVsQQ2cJnLwjXrh7tmwAEAAIgkpbEdM90AAAAAXMJsN1CPi8I047eZ9QYAAIBBQzcGqAAAAACA1Ji1BgAAgEWY6QYAAACoRkrTDwPxjEI2Rxs7CwduJh9n5hsAAID6rA79gga3AAAAgBwZ04D8rR/ungnLdDnDjdlyAAAA6jN46AYAAAAgBqEZqNsQoRjBGwAAgLoI3QAAAAAAdMASUwAAAHURugEAAAAAijbEDDQCNwAAAPWJEroxnTMAAAAwpK7GIoxpQH4EbgAAAOjLWuwGAAAAAPRJUAbqM0TQBgAAgDi2N/eTGe+JtrxUKhsAAAAAABjWtFBMF0GZ9cNdgRsAAAAGEy10AwAAAJCb7c392E2A7I1CMeMBmbZBmdFjxx8XM2wj6AMAAFCnlaZpmpgNMFgFAAAsY1TkOtrYidoOIG1dzbhrHIOarR/uzjzetj0etwmpjD9n6uEW/REAAIBhpLK60lrsBgAAAAD0KZVBGMjRZMhl/PtRwGTabDNdBmVSD9oAAAAwrJTGeqLPdBOCq8QAAIDlXHTlPVC3rgdhjGFQC0GX9vRFAAAAhpFS6MZMNwAAQBGmXXkPAAAAAEA5UgrchBDCauwGhJDeRgEAAPLm6nwghH7GG4xhULL1w93Tf7RnuwEAANTHTDcAAECRRoUvs94AwMWERQAAAMhBihdDJTHTTQhpbhwAACB/CokAQI3MWgQAANC/ZEI3AAAAizKbDTCU7c392E2ApYyHMIQy6uB9BgAA6I/QDQAAUDSBHKBLZuolZ4IXdRO+AQAAcrV3sJXsmMxa7AaM2zvYcsUYAADQyjzFo/XDXeEbAKo1eawUvOjPEH2O8fdv9Fpt3lP9IgAAgO4kFboBAABo62hj58JCk8IiADCkyb5HVwGXaX2aRfs5o8cJ3wAAACxH6AYAAMhW26u6Q1BcAqBck8c6wdP0jGaZSaVfkko7AAAAciV0AwAAZEtREYAaTS4PNO170nHZ8l4XBV8mQzp9mfX8wjgAAEBsewdbsZtwodXYDZiU+gYDAADS06YgpBAJQM5mHccc3/K3frh75n0cfe29BQAASNdK0zRN7EZM2t7cj90EAAAgM20LUq7chvL1eWGPsQuGdtFMJEIZ9EmfCQAAiCWHSVssLwUAAFRpcikOAEjRZYEagRv6Nu0zNh720p8CAABqltzyUgAAAAAApEvYCwAA6FsOs9yEIHQDAAAA0FouAz8AfRPAAQAAaiZ0AwAAFMHSBgCUZP1wV5gBAAAAEid0AwAAVEsxE4DUCNsAAABQu5xmGBa6AQAAirBogVJhE1hUTgNAAH0SFgMAAGq1FrsBAAAAi1LcAaAUjmkAAACQHzPdAAAAWeqyOKnQCeUZahYas93QBcchAAAAyJOZbgAAgCz0XZAcPf/Rxk6vrwMAUKr1w119KQAAYCm5XeBkphsAAACAJeQ2GER6jjZ2BBUAAAAgQ0I3AABAstYPd0//DfmaQP62N/djNwHm5thDSWL03wAAAGJJLnRjUAwAAIhNkQiAoTn2UCKfawAAoHTJhW4AAAAAcmOJKZZhaSlKJngDAADMK8fxlbXYDQAAAJiUQnFm/XBXERQAoAPjfTv9KwAAoCRJhW4sLQUAAKRCQQiAIaQQNAUAAAAWY3kpAACAKRRBgbZynAKZ+IQ8qY0+FgAAUBKhGwAAIBnrh7tJFWJSagvQjgAMORG8oTb6WAAAwKRcx3KSWV7K0lIAAFCn1Isu4+1TFAUA6Mb64a6+FQAAkD0z3QAAAMxBUQjyEuvinlyvyiI+xxlqNJrlMPUQNgAAwCxCNwAAQFSKjEBfzKoLAAAAkL6cL2JKInRjEAwAAOqVy5XNubQTgPyY6QP0tQAAgDwlEboBAADqZaYboE8u9CF1ggYAAACQL6EbAAAAoFgxpifOeUpkhid8CtcIoQEAALkRugEAAKLJbTmNnNoKQD4EbwAAAKhV7hcvCd0AAAC0IHgDzCP3ASOAWPS1AACAnEQP3VhbHQAAyI1iEAAAAAAA0UM3AABAvSynAUDtcltqEQAAALgmaujGLDcAAECuFEgBAPohjAYAAOTCTDcAAEAUJRRTcm8/1MAFP6TOrG8AAACQL6EbAABgUCWEbYB87B1sVfnaAAAAAKkrYewkWujGlWYAAAAA1E4QFWYT1gYAAFJnphsAAIAlKAYBAAAAANQpSujGLDcAAEBpBG8gPSlMUZxCG0iXYwfMZxRy9jcDAACkxkw3AADAYEovlJT++wEAxKa/BQAApEToBgAAGEQNBZKjjZ3YTQAAAAAAYCBCNwAAAB2pIVgEubCsEzkQ1gQAAIC8DR662d7cH/olAQAABrN+uCt8A5whAAQAAABwVinjJWa6AQAAeldjCKXG3xlSkeKgTYptIj7HCljM6G/H3xAAABCb0A0AANArxRAAALomeAMAAKRA6AYAAOjN+uFuONrYid0MoCJmlCEnjpEAAACQt0FDN9ub+0O+HAAAEJGrj6/+7jX//sBZAkEA/dDfAgAAYjHTDQAA0DmFj7NsD2BE8IZxjg8AAACQt8FCN2a5AQCAsikcXsz2gf7lEmjJpZ30y3EBAAAA8memGwAAoDOWU7qYbQOMCN7UzfEAAAAAyjBI6MYsNwAAUDbFQwAAAAAA5lHSxUgrTdM0fb+I0A0AAJRP8Ka9o42d2E2AYuQ+WGPspE6OndAtfSsAAMhD7uM44ywvBQAAdEKRg0mKyQDAkPQ9AACAofUeunGlFgAAlGv9cPe0uKHI0V4N22z8d6zh9yWOEq6OKuF3oL2jjR2hVeiQvycAAGBoa7EbAAAA5E+YghCufQ6ONnZmhm1mfVZGRbLx2xXOgBo4hkJ31g939R8AAIBB9TrTjVluAACgbIoayxufLSgXl7V3kd8nx+0AAAAAANTNTDcAAEArghH9yO3KbJ8D6N7ewZYLmCpjXwrdy61PBQAA5K23mW4MEgEAQFnMRFKXyffb+w8A5EKfBQAAGMpK0zRN108qcAMAAOVRvBhGzCuzU36PXbHORfYOtmI3oVPGVeqR8n4XcqbfAAAAaStpLKe3mW4AAICyKF4Ma+hCrMIvOdo72CpqkGakxN+J8+x3AQAAqFFp4x5rsRsAAACkabwYeLSxozg4kCG28+g1vK/krLQBGupi3wv9Gu/rAAAA9MlMNwAAwKUUB+NYP9w9/dfX8wMwPEEA6J+/MwAAYAidh26sOw4AAGVQqEhTnyGcVPksMqmGWW5q+B0BAAAActdp6EbgBgAAoB+TyyTMG76ZvF9tgR3KI4wCwDz0eQAAgCGsxW4AAACQFgWKtF30/owHcybvt364m+2MMZOBI+pVW+Bm72DLBU6FcqwFAACAMnQ2041BIAAAgH5NFmlnhVBmFXMVeQHisy8GAACAcnS6vBQAAJA3hcC8TAvhmA0GIF2OswAAAFAWoRsAAICMrR/uKuICJM6+GoYjgAwAAOkqcenwtdgNAAAA0nG0sRPWD3dP/ycfNbxfo99RMY2ajAajLOsNMD99BQAAYCgrTdM0yz6JgR8AAChTDUEO8qKIVqcSr4JahPGXfDmeQv/0EQAAIH0ljvFYXgoAAJhKgZDU+YxSmxIHpmpgXwUAAADlWnp5KVdZAQBAeRQISdXkZ3O0HBrlEjQhZ46nAAAAULalQzcAAEA5FAcBAMiNAC4AABCL5aUAAADIliJb2cxyc55tAnCWvgAAABCT0A0AAABZUmQrm3DJbLZNHsweB/062tjRFwAAAKITugEAACA7imxlEyoB4CL6AQAAQCrWYjcAAAAAgHb2DrbC9uZ+7GYwhRluoD/CNgAAkK9SL7JaKnRjcAcAAIAY1g93Fd4KVeoADGUTtIF+OeYDAACpWnh5KYEbAAAoj4IGOVHkpnYCSulw/IR+HG3s+PsCAIAClDyGsXDopuSNAgAAQB7WD3dP/5E/Yw3t2WYAAAAA8SwcugEAAAAgPsGb+AT/oHtmuAEAAHJgeSkAAOCUoiE5svREGQRHAHBMBwCAMpWcLzHTDQAAAEDmhJbiEViFboyHbQRvAACAXAjdAAAAkLX1w93TorfiNzUTvAFyJWQDAABlK3nMQugGAACAIgje5KvkgRcArplcPspyUgAAQO6EbgAAACiK4h01E2ACUjQtbAMAAFCCtdgNAAAA4jMzCBCLkAi5cuyE5QjeAAAAJTDTDQAAAEBBBJmA2CZnthFSAwAASmWmGwAAIBxt7CiGUIz1w11XzwO9csykdqPj7OTfwuTx1/EYAAAondANAAAAxRkVARX7qNXewVbY3tyP3YwiCdzANY6zAABA7SwvBQAAhBAUTQAAAAAA6Fbpy2AL3QAAAFAkQbL0lT7oEpvtCwAAANAvy0sBAABQtPXDXQEcqjUK3lhqCliWYykAAMB5ZroBAABOKaZQkvXD3bB+uHv6NWkxC8uwbG+gLf1CAACAyy0UunF1FAAAALAoAZA4bHdgXgI3AAAA87G8FAAAcMpsIAAwnWMkNRktzSh8AwAAcDHLSwEAACEExUSgf3sHW2Zbicz2X4xjJLURtgEAAJiP0A0AAKCYCPRO2CMd3gtgklltAAAAFiN0AwAAlRO4Afom5JEe7wkwMh62Eb4BAABoR+gGAACAagiZwTWW+wIAAABYjtANAABUav1wVwCBqvi8xyHUkT7v0cXsOwAAAIBZ1mI3AAAAACiTMAdAmiwhBQAA0A0z3QAAAABUzlJTswknAAAAALMI3QAAQGUsK0XNFM+HI8CRJ+/beY6ZAAAAwCxCNwAAUBmhAwAuInhzjcANJdIXBAAA6I7QDQAAVOhoY0fBher4zMP8BG8EbiiP/h8AAED3hG4AAACoggI6tFNz8Mb+AgAAAJiH0A0AAFRo/XBXQRHoTc1hjdJ4LwEAAABmW2v7gO3N/T7aAQAAAL2xnAbQxmifIaAKAAAAXMRMNwAAAEBnzIxSHu8pAAAAwHRCNwAAABTPkmpAW/YZAAAAwGWEbgAAoEJHGzuW2wE6Z0aUcnlvAQAAAM5bi90AAAAAIH9CGZTELDfkTrgaAABgGGa6AQAAoAoKkADUwPEOAABIRQ0XaQndAABApVzFD3SlhgEU6nqfhRbIyfiyoT67AAAAw7K8FAAAVEbYhhopQgJQOsc6AACA4bUK3Wxv7vfVDgAAYGCjwowQDrCMmmY/oQ6OiwAAAMC8zHQDAACVcRU0tfGZ74/ADQAAAAA1E7oBAICKuZqfGkx+zoVwuiFwQ6nMBAcAAADMa7XNnQ2oAQAAANTL2BCkR0AMAAAgnlahGwAAoBwKNNTKZ395gheUzn6C1I3P2mYGNwAAIEW1jB9ZXgoAACqkmEjNFCeBy1hiihw4ngEAAMTXaqab7c39vtoBAAAAAAAAAADZsLwUAABUyJXRwKJqmRqY2XwGYHhHGzv6bwAAAAkSugEAgEop3FAry8UAkJPxPpvwDQAAQFqEbgAAoGIKN9TIZ35xZjihNo6TAAAAwEWEbgAAgKlXUCs0UiKfaQBy4HgFAADkrKYLt1aapmnmvfP25n6fbQEAABJmSR5KopjZXk2DJVyuhjEixz1icYwCAAByV9M4kpluAAAAAGCC4AOxCHwBAADkY+7QTQ1XMAEAALMpPkK9aro6CcY59gEAAAAXMdMNAAAwN8VHAID+HG3s6G8BAABZq+3irbXYDQAAAIChjZbuUNi8XG0DJWBpHwAAAGBeZroBAABacQU2JVFch8UIYwEAAACY6QYAAACYQbACYBgCzQAAAHky0w0AALAQxSFKsX64a8YbAAAAAKA1oRsAAAAIlpoC7AcAAACAdoRuAACAhZnthlIcbez4PEML25v7sZsAAAAAJKbGpcqFbgAAgKUIK0CZahwkoW5muSEW/SgAAIB8Cd0AAACdGIVvFI7IkWI7tCOUBd1xDAIAAMiX0A0AANAphSNyJCwGCI4Sk/4TAABAnoRuAACATilYkjNFT8BxjBh87gAAAPK00jRNM88dtzf3+24LAABQGAEGclV78dPSQcyrxPEixy5iqf3YAwAA5K/GMSUz3QAAAMAERXcAhjAetHHsAQAAclZj4CaEENZiNwAAAABSYZYBqJvQA0MaHXMcewAAAPJlphsAAKA3Rxs7CkkAAFOsH+4KegEAAGRO6AYAAAA4Y3tzP3YTAAAAACB5QjcAAEDvzHYDUKbS1mt3vGJoPnMAAAB5E7oBAAAGoahEDkbLfFjyw2w31MvxCgAAAJiX0A0AAACMqT1sA7WzD2AoAl4AAAD5W4vdAAAAoB7jxSVFTQBS49jEUARuAACAkpS2/HQbZroBAACAGUbLTNVYiK95sASgbzUeVwAAAEokdAMAAEThCm9yU2v4BmoyOjY5RjEExxQAAID8Cd0AAABAC4qkcFZpsyIJ3gAAAMD8ShsXaEvoBgAAGJwZQ8iZQjwAXdEfAgAAyNta7AYAAABADmoL22xv7ld/pRL1EoQAAACAyxk7MtMNAAAQQW3hBcqgCA918LfO0HzmAAAA8iV0AwAARCF4A+nb3tyP3QQYnOMTAAAAMC/LSwEAAFG4qhugDCWFsxybiEHQCwAAyJGlpa4y0w0AABCFAhM5Wj/cra4oX1KgAgAAAAC6JHQDAABEUVtwAYD0CYQCAAAAbQjdAAAAg6pxphDKUmNR3mw31KTGv3EAAABgMWvz3nHvYMsgGwAAsBRhG3KmEA/1GP97d+yib+OfMccaAACAvJjpBgAAGISiJeTNhThM43MBAAAA9dk72IrdhGQI3QAAAINw5Ta5GwXHag6QCVhQm5r/3gEAAIDLrTRN07R5gAE2AABgGQqYlKD2EJmrmQihrjEixy6GVvtxBgAASJuxoWvMdAMAAAxG0RKAHAlAMJSjjR2fNwAAgIwI3QAAAMCcFEOvqmmGEwAAAACuMcvNWa1DNzYgAAAANRK2OUvwBqBbjjMAAAD5MdMNAAAwCEtLkTuf4fMEb6iJma4AAAConUlazhO6AQAAerV+uCusQDF8lgHBG/qizwQAAJAfoRsAAACYk2L7eWa7qVOt77tQBAAAADBO6AYAAOiVkAIApRgd0xzb6IMlzAAAgJRZWmo6oRsAAABgKbXOekKdBG8AAACAEaEbAACgV5bhoBQK7BcTvKmH9xoAAADgKqEbAAAAoBPCGOXzHkN/1g93hZUBAIAkWVpqtpWmaZpFHmiQBQAAmEXBiJKZ8eZyBmLKZCxoOsc8+uBYAwAApMRYz2xmugEAAAA6JZxRHu/pbMIRAAAAUC+hGwAAAJiT4vr8hDSoiX0DXbPUFAAAkAqz3FxM6AYAAADmoKhOrQSoIB7BGwAAICaBm8sJ3QAAAJ0YFYUUhyiRwM1ihDXy5z0EAACAOgnczGctdgMAAIByCNwAlEHYph3HP/q0frgr/AkAAJAooRsAAGApCkHARbY3910ZlQlBm8WNjoPCNwAAAJTAWM78Fl5eykYGAABGFBmBiwhzUAshVPqyfrh7+g8AAIB0LBy6AQAAgBooondje3Nf+CZh3pvu2GfQJ58vAACgbyZgaWep5aX2DrYMygAAQKVcaQ1QBmM73XBcpG8CNwAAAOlZeqYbKScAAABKZjmPbgl4pMX7AflwPAIAAPom/9Ge5aUAAACAQQl6pMH70B1BCIYkfAMAAJCOTkI30k4AAABAGwIflORoY8fSPwxO8AYAAOiS3MdizHQDAAAAl1BM74fgTTy2PeTPsQkAAOiKwM3iOgvdeBMAAKAOljSgRj73/RH+GJ5tDmVwXAIAAIjPTDcAAMDcFHeomRkFgMvYTzAknzcAAID4Og3dmO0GAADKJXAD9MXMK8OxraEc+mYAAEAX5DyWY6YbAAAAmIMlpvolDNKv7c192xgK5NgEAAAQ10rTNE2XT2gABwAAyqOYA9NZ2qN7rq7qnrGaOBw7GZLjEQAAsAjjMMvrfKYbbwoAAJRHIQcgTwI3AAAAwDSyHd2wvBQAAHAhyxYAQxISoQSOmwxNfw0AACCOXkI3ElEAAFAGxRuYbTQDlL8TAAAAAHIi09GdtdgNAAAAgBwJ2/RnNNuNASCAdkbHJkuDAgAADGOlaZqmryc3JTQAAORJmADmo6jZL6Gb5RmbicexlNgcowAAgMsYe1leL8tLAQAAACxLYIScHW3sCD0Qjc8eAABwGYGbbvQauvEmAQAAUCLF9OEI3izOtgMAAACmkeXoTu8z3XizAAAgL5bDAAAAAACAy63FbgAAAADkwuw2cWxv7ruoB2AOjlMA1Gz8nGF81sfRz80ECUAfBgnd7B1sOZABAEAGzHJDKkZFQ59JWIxxGAAASrBo+H7a49QrAa5yYVO3el9eCgAAAC4zCtkcbewkfZX++uHu6T+GZXCcXKW+X6Msjk8AlKSPorBCMwBdE7oBAACECIhmvBg9WZT2mQSA9hw/AShBn+EYwRugZvaB3RtkeakQTNkGAADANbNmfUi9UGi2iri2N/cNDs3B+AsAADkbos+vbglAVwYL3QAAAGlKPeRAXY42dnwmgeLYrzEkAVEAcjV0wH70esI3QA1cxNQfoRsAAKiYIiBDy30JqfXDXcVMoDWBQobiGAVAjmIXgidfXwgHKE3s/WzphG4AAAAYnOIzi7LEFMBs48dXARwAcqBvD0DuhG4AemBaSgCA6XIP2yhgApALs7MBkLKUwzbjbTPGD+Qu5f1tKVaapmmGflEHKKBksw5e9n0ApCj3AAQMRdEyLQaMLubcI12OuwzN8QuA1OTYl9e/BnKV4z43R1Fmutk72HKAAopy2UHrsinw7RMBGJqiHwAMy7GXIQnbAJCiXIu/6ppAjnLd5+Yoykw3ISgwA3nq6wBlnwjAkBT9YDEKmGkxeDSb84t0OQYzJMctAFJRSt9dPxvIRSn73VysxnphbzSQi72DrdN/AJA7xT4AgDro9wGQgpLG1Uv6XQDoTpTlpQBSN+o8S64DUBKFF2jPLAHpumwJV0iN4zAxjT5/jmsADEVfHSAO+9/hRZvpBiAF47PYjA5C4wcjByYASqLIAgDxOA4Tw/rh7pnAl/AXAEMoeVy95N8NyJ99VBxmugGy0OXMMxcdcByMACjd0caOYgtAwczWmbZR8MaxmFiEvwDoWw1j7HsHW/rdQHJq2P+mSugGSNa0g8O08M08gRwHGgC4SpEP5qcwmT5LTJEr4RtiGP/cOcYBwHIEbwAYiRq6cUACppln0HxWIGdaGAcAAKAGxliAi0wuMyV4AwCL0/cGUqImGpeZboCkLHtQyO2gsmzHfPL3Hb/SV6cfAADq4uImoA3BGwAAyF9utdESCd0Ayaj1oNB2YHze7WTAHYBJlrCAyyk+AkNwTCYVgjcAsBgXvwIpqLW2mprV2A0AyrZ3sHX6j/Mmt8v4tprcdvNsx2nPBwAAJTPIfZZzgPQJ3JCy9cNdn1EAmJNzESAm5//pWGmapondCAclKNe05Y8mbxtfEqlmQ2wH+1uAeimewOVc6Z8v5xNn6fenz3GZ1DkmArCMWvrn+t1ALLXsZ3NheSmgN5ft8IVtzhpiW0x7DScGAOVT2AMAAADo1vh4u3F2gHolsbyUpWegHuNLJU3+jDhsfwCAqyypkS8D3NfYFnkwiwgAQFmMswNDsb9JTxLLS40zOARlsMPPi30vQNmECGB+CuH5cg5ylb59fhynSZVjIgCL0C/XJwf6Yf+ariRmugEgLgdqgDKZtQMA0ne0sSPcAAAUQ+DEeDvQPfuVtAndAJ2z4wcAIEeK3uROgQPogxA3AADAbMktLzVioAjyJHCTN/tegHIojsBiBG/yVvv5iP58vhy3SZ3jIwBt6Jdf7ZdP2w4x++yptQeYT+371BysxW4AUAY7fAAAcqaYCMQ02gcJ3wAA5O+iesnewdZgQZdRO7Y392e2acj2AJQq2ZluQpCuhKEtEpy5qLNGnux7AcqgaAfzEbYpS+3nJvry+XP8JmWOmQC0UXvffF599eHbbn/nEpAe+9F8JD3TzXgCE+hWVztqO3wASItiHbSzfririAgkwTEcAKA+4zWWyXrorNsmZ6eZZ0abedqhHgvpUH/NS9Iz3YzYyUN37KSZh/0uQL4U7KA9oZty1H6+ox+fP8dxUuZ4CUBbtffPFzUrPDPEygPOKSA++878rMZuADAcO2kAKJ9iCAAAXdPHBIDhzKrlDFHj2TvYUksCaMlMN1A4nSMWZd8LkCdXyEM7iohlqfn8R/+9LI7npMgxE4C2au6fl8p5B/TLfjNPWYRuQrATh0XYMdMV+2CAPCjQweUUDMtX63mQPntZHNNJneMpAPOotW/ONc5TYH72mflai92Aee0dbNkxQwt2zHRp/PNkXwyQJsU5gHrpo5fFMR0AgFKoLcB81HXzls1MNyN2yHA5O2b6Zl8MkCZFOpifK/TLVdv5kL55mRzTSZljKADzqq1vzuKc11Az+8r8ZTPTzYgZbwAAAAAMTJfsaGNH8AYAgGpMhg6c6wA5MdMNFEYakqHYHwOkQ1EO2nOVfrlqOSfSH6+DYzwpcgwF4DK19Mnpl3MeSmdfWY4sZ7oJwY4WAABGRlfDuyoeAMoxfkwfhRwc5wGA1Cki07Vpnyl1YiAl2c10M40dK7XTiSUW+1+ANCnIwWyuzi9fDedH+uH1cownBY6lAFykhv44aXF+RI7sK8uyGrsBwHLslAGAkfXDXcU4oHoGXAH6pb8JwEX0xxna3sHWmX+QOp/T8hQRuvHBBAAAVx3DRY42dvyNAFkTdCAlwt4AzKJmR2zCN8DQ1mI3AFicTgMAAFxM0AYoxWh/JugAAACX2zvYMvMSSVHXLddK0zRN7EZ0xY6TGtghkxL7XYC0KMLBVYI2hFD2uZN+OI75pMDxFoBZSu6LkyfnUMRkn1i+IpaXglrYKQMAsyi+geIfUA9L5gEAqVLHIEU+l8Tis1eHokI3PrSUzOcbALjIqPCmAEft/A0AtRC4BQCA+e0dbKm1Ab0oanmpEVOEURqdAFJmnwuQJoU4aiJowzQln0fpgzPieE9qHJMBCKHsvjhlcE5Fn+wD67MWuwF92DvYsrMkW3bEAMCyFOCoieIes2xv7ju/onhHGzuO+wBAUvTByYFaMtClopaXGuegTk5GU9r53AIAQDvrh7sKzkDVxsOHgogAQExqHOTE5xXoSpHLS42TUiQ1DuKUxn4WIF2CCNRGsZlJJZ5/6X/Thr4AQ3MsBqhTif1u6jE+S6rzLRZlP1i34kM34+woy5Hbwc+OltLl8rcIUBNFNmowvqyKIh+zlHY+pu9NG/oDDMVxGKBepfW3wTkXbdkPsha7AUOyPl/+JndascI3dp4AABDXqLinyAcw23g4EQCga2ollCi3C/+Jw/6PcVXNdDPOjjIf8+60+nxP7TjhYvapAGlRXKMWAjfMq6RzOn1v2tIvYAiOyQD1KamPDbM4/2IW+0DGVRu6CcGOMnVd7KzG12Gc92fTPhd2nHAx+1OAdCm0UTpFPuZRyjmdfjfL0i9gCI7NAHUopY8N83Auxoh9H9NUHboJwU4yJXZSkC/7UoB0Ka5ROoU95lHK+aZ+N8vSL2Aojs8A5Sqlbw3LcG5WJ/s/ZlmL3YDY9g62st0xjv9hT5u95TJD/t7TZpa56HYAAADgmlzHLoA6rR/uCt4AFEgtB64ary/nXGsGulH9TDcjuewMu+7Q9P17X9TeRYJCQLpy2Y8C1MYV7ZTkaGPn9DOtkEdbuZ9/6m/TNX0E+uZYDVCW3PvTMCTnb+WxD+QiQjcnUtr5pfRHe1kwxow1wEhK+1EArlFQoxQKdywr9/NV/W36MJqNRH+Bvjh+A+Qv9340pOKic7ppf2e1nwOOtkkK28F+kMsI3YQ0/lhH/NECOUtpfwqAwA1lUbSjCzmfc+trMwR9B/rgGA6Qr5z7z1CSWs4HUwwf2Q8yD6GbE7H/YCf5AwZylNq+FKB2CmeUQKGOLuV8rq2vzVD0H+iaYzlAnnLuO0PNcjt3nGdfE+t3sh9kXmuxG5CKvYOtZHZC/oABAFiUQhmlUKCjD5ctoQwEy03RudHnybEdIA/6y0CfYu9jxl9/fIxg9PUoLxC7neRF6AaAzqQUYAQAAAAAYH6KzJC/i/6OY9Zv+t6/TAZmxn/XWa89/vPR1/aDLELoBgAACuLqdEox/jl2ZTxdMXgG89GfoEuO4wDp00+GOkz+rQ8Rwulz/zI+S83o+8mv7d8YwkrTNE3sRqQklRka7ACAnKWyLwWomUIZuRovzK0f7irU0alcz7X1r4lBX4IujY7nlpoCSE+ufWSgf8uci3a1b5nVBvsuUmKmm0RZLw4AAKidghxAPGa7oUs+SwDpMhMEMEtq+4bU2gMjq7EbkBp/rAAA5E5RgxwdbewI2dCrnM/3c247AABp09cEUrd3sGVfRdKEbgDonM4PQDwCNwBl0sdmaPoUAABAbM6FyYHQzRT+eAEAAAAA+rF+uHv6DwAAIGdCNzOkErzZ3tyP3QSAhaSyHwWohaIFufP5hYsZH2BolvwDAACAywndXEDBGAAAYBiKuwBQJ8FbAAAgZytN0zSxG5G6VK4mEwICcpTKPhSgdIoV5EbIhqGVcE6tb01M+hr0Sb8AIJ4S+skAENNa7AbkYO9gK+rAlg4PAACQu1Exbf1wV2GNwTmvhuUdbewI3gBAhvSFAaBflpea097B1iAdk/HXGeo1AQAAhiJwA4szRgCUSN8AoD/6jwDQP8tLLaDLWW90eIDSmQIfYDiuPic1o1kRFNOIraRzb/1rUqHfQZf0FQD6UVI/GABSZaabBXTRSTGLDVAL+zoAqNOoeKaIBt3SvwZKtH64K8gF0AErKQDA8IRuFrRMZ0VHBwAAAIbhHBy6JRgBAGnS7wWAOCwv1aF5pnjW6QFqZAp8gOEohBGbmW1IScnn4PrYxKKvQd/0JQDaK7nfCwCpE7oBYBCKAgD9UwQjFsUxUlV68UEfm1j0OeiTfgVAO6X3eQEgdWuxGwAAACxP8QsAgBKsH+4K3gDMQdgGANKwGrsBAADA8hQmiMVnD6A+9v0AEJfADQCkQ+gGAACAuY0KrUcbO4quEJliC1Ai/QsAACAnQjcAAAC0ohgGgPAlfVs/3LWEKsAUgtcAkJa12A0AAACWpyBB3xRWAZjmaGNHP4RO+TwBAAA5EboBAIBCjEIRChUA9dg72Arbm/uxm0GF9DcYgtAvwDVmuAGANFleCoBBOCkE6JfADcBZ+p8AAJRC3xYA0mWmGwAAKIglHuiKK8shH2a7AUo12a/VPwEAAFJjphsABuOKDID+CdwAAEM42tgRgGBw+rpAbfYOtoypAkDihG4AGJSTRIB+KX6xLEVUyJN+NrE4ZgBAP/TvACAPlpcCAICCuPqXZSicUgoFCoDy6KcANdGfBYB8mOkGgME5aQToj2IEi/LZAWARAr8MxWcNqIWxUwDIi9ANAAAUZhSeEKLgMj4jACxDCIKh+cwBpRO4AYD8CN0AAECBhCm4zHg4y+cFyqBIw9AcP+jTeB9FfwUAAEiV0A0AUSgIAPRr/XDXlcBAlfQzAcoyHrYRvAFKph8LAHkSugEAAAAAIClC5AAAQA6EbgCIxtUbAAAAeTPzCAAsZ+9gyzgpAGRM6AYAAAp0tLGjCMZMPhuUSrEChjE+A4mZSOibGW+Akum/AkD+1mI3AIC67R1she3N/djNAICiCdkA0AdBCABYjLANAJRD6AYAAAqlEAYA9OFoY0c/g94ICwOlE7gBgLJYXgqA6JxoAnRPIQygTvrWAADp0lcDgPII3QAAAADZU8AAKMP64a4AOVAk/VUAKJPQDQBJcNIJAACQD0sA0TfBG6Akxj4BoFxCNwAAAAVTFAUAciV4A5RA4AYAyiZ0A0AynIACdEfQAgDoi+V/GIo+LZCzvYMt450AUIG12A0AgHF7B1the3M/djMAAACAHo0HasZDXII2QM6EbACgPkI3AABQqKONHVehV07RCuojwA7kTN8FyJWwDQDUa6VpmiZ2IwBgkmIBQDeEblC8oiaKHfrRDEP/giHowwA50P8EAFZjNwAAAOje+uGughhQHYETgDwdbewI2QAAAFmyvBQASdo72FI0AQAASNAoHCHgSxfGwzaCNwAAQG6EbgAAAIAimN5feB3Iz3h4S+gGSJm+JgAwjeWlAEiWE1mAxSlYADUSNoFhWRIIgFoYpwQAZjHTDQBJc6UuwGIs9wAAQCrGlySb9vXoe4CUCNoAAPMw0w0AABRGwQIAgNimzYI0/rPJ282aBKRE4AYAmNdK0zRN7EYAwGXMdgMwP6EbxilgURsFkqv0nxmCPgez6H8AudKXBADasrwUAFmwzBTA5RS+GKfYBUCf9DuYNL5sFEAuhGwAgGUJ3QAAQCGONnbOFTkUP4CaKJoAxHHRslEAKZjsJ25v7us7AgCdsLwUAFkx2w3AYoRu6qLYRY0UTc7Sb2Yo+hh10LcAcqNvCAAMZTV2AwAAgP4plNTDe02NFFUgHsedcnlvgRztHWzpGwIAgxK6ASArTpoBFne0saN4UjDvLzBilhtgWaM+hb4FkAthGwAgFstLAZAlhQSAxVgColyKYtRMgeUsfWVi0c8oj/4FkDr9QAAgtrXYDQCARewdbCkmAAAAQEfGAzYCVECqhGwAgNQI3QCQLcEbAAA4Tz8ZaGPabDZHGzuCN0A0gjUAQE5WYzcAAJbhJBwArlIYAyC2o40dyxEVxHsJDG3vYMtYHwCQHTPdAJA9V/ICzG9UPBHQAEqhMAOwOMEaICb9OACgBCtN0zSxGwEAXRG+AZif4E3+FMpAseYi+sbEoo+RD30JIAb9NwCgJGa6AaAoZr0BoBaKZACkatYxShgHoG7CNgBAiVZjNwAAuuYEHoAaKFyCfh/AstYPd/UpgN7tHWzptwEAxRK6AaBITuYBLne0sWO2FICC6Q8DADEZnwMAaiB0A0DRnNgDXE7wJl+uTAcgJwK/6TLjDdA1Y3IAQC3WYjcAAPq2d7AVtjf3YzcDADqlaAlcRh8YABiasA0AUJuVpmma2I0AgCEoOgBM56rmvAjbwFUKOhfT9yUH+iDp0c8AlqF/BgDUyPJSAFTDiT8AuVMIA6AklpsCKMPewZZxNwCgWkI3AFTFIAAAOTMjADAvfV5gEfoaQFv6HABA7YRuAKiSAQGAa1xhnhfFMNCXg9Loi6RFXwOYhwvbAACuEroBoFoGBwDOssQDQFn0dcmJPkh6hG+AWfQxAACuEboBoHrCNwAKXTnxXgFQKse4dAjcALMYQwMAOEvoBgBOGDQAIHWKkXDV9uZ+7CYAPXGsA0iXsTMAgPPWYjcAAFIyGjxQyAFqNl7scpUzkBrFHoBhrR/uCkMBAADMYKYbAJhCMQeAFK0f7p7+AwDomz4HMGKsDABgOqEbAJjBYAJQO0WWtAnfAFAyM6ukRZ8D6maMDABgtpWmaZrYjQCAlFlqCqjZqMBytLGj2JIgBUlqo+DTjn4sJdD/SId+B9RH3wsA4HJrsRsAAKkbH2BQuABqNFlgEcAByIN+LACwKIEbAID5mOkGABagaAHUTugmHa46pyaKP8vRhyU3+hvp0v+AculvAQC0sxq7AQCQIwMQAAAA/RG4Sdv64a73CApkvAsAoD3LSwHAgiYHIlw5DNRkdHWzYgtAPiw3BQDMInADALAYy0sBQMcUMIDaCN7EZXkHaqIY1D19V1Knn5EH/RHImz4WAMDiLC8FAB0zUAHU5mhjR6ElIss7UAt9LAAAAABSY6YbAOhZjlcPTytq5fh7AMMS/IhL8ImSCdz0Sz+PlOlf5EV/BPKjnwUAsByhGwCIIOXCxmWDLSm3HYhHQSw+RS5KpRDUP/07cqCvkSf9E0ibfhYAwPKEbgAgktSKG20GWlJrOxCfQlh8ilqUSCFoePp5pE6fIz/6KJAm/SwAgG6sxW4AANRqcnBjyALHsgMrewdbCjJACEHhC6A0+nnkZDzMoU+SttH7I4ADaRC4AQDojpluACBRXRY7+hhMUYwBQlDgSo1CFiVRDIpHP4/UrR/uTj3m6ZfkRb8F4tDHAgDoltANAGRi3uLHkIMnCjKA4lZaFK8oiYJQXPp55Ei/JE/6LzAc/SsAgO4J3QAAS1GQgXopbKVFwYqSKAilQT+P3Oib5Es/BvqjXwUA0K/V2A0AAPJm8Abqs364q6gFACTnaGNHeCNTo76lPiZ0y5gNAED/hG4AAIC5CNsA1EWhjlwJ3+RJ8Aa65TgOADAMoRsAYGkGcqAOilfAULY39y1tlAj9PHIkKFwO7yMsxvEbAGA4a7EbAAAApE2xI30CUQBAScb7n+uHu/o60ILADQDAsMx0AwAAzCRwA8SiYJQO7wW5sbwUUCvHbACA4a00TdPEbgQAkD9LQEB5BG7yo8BISRSN0qO/R470Z8qm7wNX6TcBAMRjphsAoBMGeACALuwdbOlXJMr7Qo6EMuogXEXNHJ8BAOIy0w0A0BlXP0P+FCzypahICRSN8qHfR270ccqnL0SN9J0AAOIz0w0AAAAQnaJRXrxfABCXYzEAQBqEbgAAgBCCK8ABaEexDwDicAwGAEiH0A0A0BmDPgDDOtrYOf0HOdOHyJf3jhwIFgMlcewFAEiL0A0A0CmDPwDDELQBUqH/R+qEVOsgXEUNHHMBANKzFrsBAABAXAoUeVo/3FU8JHsKR8DQxo+d+kBl0S+idPpNAABpWmmapondCACgPNub+7GbAMxJwSl/ikzkQKGofPp/5EpfqAz6Q5RMPwoAIF1CNwBALxRdIC+KTflSYCJ1ikR10QckV/pCeRr1g8bfP30jSqIfBQCQvtXYDQAAymRgCKB/ikqkbO9gS3+gQt5zYBlHGzun/6bdNut7fSIAACAWM90AAL1xpTPkwZXd+VJgIlWCF+gHkqNRn2j8+Kqf1I/JPsz64e7Mfs1Ft0HJ9KcAAPIgdAMA9ErBBdKmkJQvxSdSpUDEiH4gJdBXWtzk0k/j3+vHwOX0qQAA8iB0AwAMQtEF0qSQlCeFKlKkMMQ0+oCUQH9pMforsDj9KgCAfAjdAACDUXSBtCgg5UsRi5QoCnEZfUBKoe901rRluPRRYHn6VgAAeVmL3QAAACCOySn/yYNiFilRFAJqdrSxU2U/alpfRP8EuqFvBQCQH6EbAGAwewdbrnQGgEIoCgG1ESyxDaAv+lUAAPkSugEAAMiEQhcpUBSiLcFryMu02RD1QaA/+lYAAHlbaZqmid0IAKAuii6QthqXSciBYhcpUBRiWfqBlKqU/tO0/sb64a5+CPRE3woAIH+rsRsAAADAxRS6SIGiEF3wOaJURxs7p/9KU+LvBAAA0BWhGwBgcIotAPMptXhHPkbHbMduurR3sOUzRdEcv4F5OBYCAJTB8lIAQDSWF4D0lbJUQo4U64hNIYgh6A9Supz6UvoeMCx9LQCAMpjpBgCIxgATpG9yqQTFGACA+ek7AZPM+AYAUBYz3QAA0bnCGfI1fvX20cZOVldz50ChjhgUgRiaviC1yKGfpO8B/dLPAgAoj9ANAJAExRYoRw4FpVwofDEkRSBSoE9I6VLvJ+l7QH/0tQAAyiR0AwAkQYEFypN6USl1il4MSRGI1OgbUoMU+0r6H9APfS0AgHKtxm4AAEAIBqAAxil4AbXTN4Th6X9APxzTAADKJnQDACTDQBRQK0UuYnL8BUBfBLq3d7ClnwUAUAHLSwEASbGUAJQpxeUTUqHIRUwKQaRO35DSpdRH0ieB7uhjAQDUw0w3AEBSDExBmY42dk7/AcC8zBIA/dI3g+45bgEA1EXoBgAAACqkIEROfF6he6PAjWA0dMfxCgCgPpaXAgCSZCkBKFNKSyikQIGLWBSEyJU+IiVaP9w97RMM2VfSD4Fu6FcBANRN6AYASJaiCpRH6OYahS5iURiiBPqJlGyZ/tJ4/+Ki59EPgeXpUwEAEILQDQCQOAUVKI/gjUIX8SgOURL9REo2mv3msn7T+Aw5F/UvRs+jDwLd0KcCAGBE6AYASJ6CCpRF6EbBizgUhyiRfiK1uSxcA/RHXwoAgGmEbgCALCioQHlqDN8okhGLIhGl0kcEoG/6UQAAXEToBgDIhqIKlKem4I3ADbEoFFED/UQAuqYPBQDAPIRuAICsKKhAWUoP3QjaEJtiETXRTwSgC/pPAAC0sRa7AQAAbewdbCmoAEkTtCEVCkYAAPPTdwIAYBGrsRsAANCWgTAgNUcbO8I2JMWxkhr53MMw9g62zvwDAAComeWlAICsmfUG8pf7ElPCNqRGART0EaEPlx1f/N2RK30nAACWIXQDAGTP4C7kLbfQjZANKVM0gqv0D6EbbY8r/vbIlT4UAACLEroBAIpgcBfylmrw5mhj57RtNYdtrlx5OFw5vhK7GVziD/7Pi2I3AZLyCy++J3YTKMB1q9eF6657ROxmDGIUOtje3F84gDDrsc7XSJWwDQAAyxK6AQCKYBAX8pda8GY8ZLN+uFtt6ObKlYfDn33kV8I3/7+vxW4KAAzuphseGf7fH397EcGbVMIFF527XdTG8UCP8z+6ksrfBQAA+RK6AQCKYwAW8hY7fFNruGaWh7/1zXDPh34h/O//5/fD9Ws3hbB69efH161c/X91JRyvXv26WVmZctvVBzSr528Lo59Nedzp/Sf/v27suU4eN/q+mfLcq6tXT3lXrmtOv19dOfl67GdX/x/7euK2lbHHXXfucc3Y/cO521ZWz9///ONOnnvl5PHXfoXTn43fFkII143/bHXitjOPb849z+rkc419P/l6o/9XVq6+5rS2jD/udPuOfb86cdvZ33PyZ82115t8rnDy/Wk7zj/3tNedfJ6VsBpWTj4/KyfPNv79Shjd8eS2MNoG12676HErp49bGXvc5M9WTr8/d/+J5w5NCKE5Pvl68v8mhONZtx1feFsz+np0nzB2n8n7H0+7rZl92+hnx835thw35+8z7WcTz91Mvt6Zx08+buy+xzPae3x87nWaK2OPP/n69HVHE35dOQ7N6HFXzr5ec6W5tg1Gjx+/77mfHV97jXPPFc7+LuOvO7rP6eZZGfs1V87dNv71mdvCytS3+NzjTp7z7Ft98lzNtfuf3jalDaPHH5/8nsenm+nk+yujdjSnv/vx8dn7Hl9pRpvs/G3H4dzjrow97nTTXZl8XBOuXBm182xbHjr+VvjV8DfhRT/5B+ER198UcpZisGCZGXVmPX7Wz2CaFP8uAADIz1rsBgAAdM3Vj5CvGIGb0RJSwjYXu37tpvCI62+aGp45Dd1MvW126OZcsGau0M3s20ahm5UpoZvxcMusYM28t7UN3Ux7rlm3zRN+GQ/KTIZupgVrLgrdTHvui153VltWV5qZoZtpwZh5Qjer00I3o+/DPM+9fOhmenimq9DNte+XC91cHKy5OHRzmlA4f5+5QjcX3DYtPDMzdHM+/DLtPvOFbpZ73amhm8mAzWWhm2tpkvOPnxW6GXu9M8813u4prztv6OZ47OsztzXjoZsLwjoXhW6mPP7C0M3KROhmFHQJJ8+z0pz5+ur/J9+HJlwZ+/rM48JYsObktmu5peba2z75nCtjzznl9ejPsoGHaY+f9TPnhgAAQF9WL78LAECeXLUG+Tra2OktBDP+vKOvBW4AAMq1d7Dl/JBTPg8AAHTJTDcAQNFMLQ55GSr8MprdBgCAeoyfHzo3rI+gDQAAfRC6AQAAkjUZwlk2KDNtlhsAAKBcwjYAAPRJ6AYAAMjGMjPUCNkAALURNqB2/gYAAOjbauwGAAAMydrtkL+jjZ3Tf5fdb9rXAAA1cN4DAADQPzPdAABV2jvYCtub+7GbAfRA2AYAAOokbAYAwNCEbgCAagneQN5Gy0wts+QUAEBJBA7m4zywPD77AADEInQDAFRN8AbyZUYbAACol6ANAAApWI3dAAAAAAAAgHkJ3AAAkAqhGwCgensHWwbsAACA7JnFk9I5fwcAIDWWlwIAODE+cGewGgAAANIgaAMAQKrMdAMAAAAAkDkzgMzPdsqL9wsAgJSZ6QYAAAAAAEiKsA0AADkQugEAAAAAyJRgAiXyuQYAIBdCNwAAAAAAiRoPH2xv7s+8jflNbkfS4TMNAEBuhG4AAKYYDfQZjAUAAGKZDCAIJHRj72DLuV6CfL4BAMjRauwGAACkzKAfAAAQg3ORftm+afF+AACQKzPdAABAZboa0HZ1MAAAOTPDaXzCNgAA5E7oBgAAEnbRIPT25v7U28eLBn0OYi86Lf88bVL4AABgCPqd8QjcAABQAqEbAIBLLBosgGXMMwA96z5DDl5PvtZkEGjyb2fetrnqGACAIeh3xiFwAwBAKYRuAAAgAaUMOk/+Hsv+XtNCPQAAQL5KOfcBAIAQhG4AAOZithu6ZJB5cZdtO3+nAEApZi0lSvf0IYfjMw0AQGmEbgAAoAMXDR4rmAAA0Jb+I6XxmQYAoERCNwAAczLbDdPMM3BscHk4/k5nu2yprvHbbUMAiEv/cTj6PQAAwDKEbgAAWlDQZ5xiSJpG74u/1WumfVZH+7NZt408+OCD4Z5H/kKv7QOAlP3B/3lRuPnmm0+/18coh/dyOM6dAAAoldANAABAwS4qcCh+AMByZh1LhTkAAADqIHQDANDSZUu0UAdhhfSlNDPVZW1pu7STzx8AxNNmedF5+yKO7cNLpZ9YA59vAABKJnQDALAkS9nUx6BxPlII3ox/XqbtLyY/Tz5fAFCOyeUcY/dLAAAA6JbQDQBARxYplBt0h/7FCt5cFKYRrAGAekz2AZwDxOc9GI5+LwAApRO6AQCIyBWv+TFozEV8PgCAy0yeA+g/AAAA5EvoBgAgAeMD7QI40L3JYlYff2cKZgBAG2a9icM2H47+MQAANViN3QAAAM4yMJku7w2z+GwAAAAAANTHTDcAAAkaYlYOYHnCNgDAMvQlhuW8ajg+2wAA1ELoBgAgA0I48Rk0LovlHAAAAAAAWJbQDQBAhsYDIIIDsJjR31HbvyEBLAAAAAAAQhC6AQAAKifEBgAA3RFSBwCgJquxGwAAwHL2DrYMakJHLvt78rcGAAAAAMCImW4AAAAusHewFbY396sP3Hzr/37z6hcnl24cH69c/X91JRyvXv26WTn52XXjt119QLN6/rYw+tmUx53ef/L/68ae6+Rxo++bKc/drDYnj7v6/+pqE1ZXTr4e+9nV/8e+nrhtZexxx+ce14zdP5y7bWX1/P3PP+7q/ye/Qhj7FU5/Nn5bCCFcN/6z1Ynbzjy+Ofc8q5PPNfb95OuN/l9Zufqa09oy/rjT7Tv2/erEbWd/z8mfNddeb/K5wsn3p+04/9zTXnfyeVbCalg5+fysnDzb+PcrYXTHk9vCaBtcu+2ix62cPm5l7HGTP1s5/f7c/SeeOzQhhOb45OvJ/5sQjmfddnzhbc3o69F9wth9Ju9/PO22ZvZto58dN+fbctycv8+0n008dzP5emceP/m4sfsez2jv8fG512mujD3+5OvT171yspmuHIdm9LgrZ1+vudJc2wajx4/f99zPjq+9xrnnCmd/l/HXHd3ndPOsjP2aK+duG//6zG1hZepbfO5xJ8959q0+ea7m2v1Pb5vShtHjj09+z+PTzXTy/ZVRO5rT3/34+Ox9j680o012/rYzH79mtMlOv7+26ZrxTRiOm+Z00zcTt30z/N9AOcxoCAAA9GGlOR05AAAgZwaR+1d76II6fe1rXwtPfOITw9e//vXYTQGAwX3bt31b+Nd//dfwyEc+MnZTWJLzpeE4bwIAoCZCNwAABTGQ3B8Dx9TqwQcfDI985CPDv/zLv4Sbb745dnOK9eCDD4Zbb73Vdu6Z7dw/23gYtvMwRtv5a1/7mu1cCOdL/XPeBABAbSwvBQAAwKVuvvlmBccB2M7DsJ37ZxsPw3YGAACAuFYvvwsAALlwVWE/bFcAAAAAAGCS0A0AQGEERAAAABiac1EAAGpkeSkAgALtHWyF7c392M0ACnDDDTeEu+66K9xwww2xm1I023kYtnP/bONh2M7DsJ3L4vyoH4I2AADUbqVpmiZ2IwAA6J5B5e4YSAYAgLw5P+qWcyQAALjKTDcAAIWaHAQ1yAwAAMCyBG4AAOCa1dgNAABgGAZGAQCAWjkf6obtCAAAZwndAABUxABpe7YZAACAcyMAAJhG6AYAoDIGSgEAAGjDeSQAAEwndAMAUCEDpgAAAMzD+SMAAMwmdAMAADMYXKYW73znO8OTnvSkcOONN4ZnPetZ4e/+7u8uvP+f/umfhqc85SnhxhtvDE996lPDhz70oYFamq822/juu+8Oz33uc8OjHvWo8KhHPSo8//nPv/Q94aq2n+WRe+65J6ysrITNzc1+G1iIttv5q1/9anjFK14RHve4x4UbbrghfO/3fq/9xhzabuff+73fC9/3fd8XbrrppnDrrbeGO+64I/zP//zPQK3N01/91V+F22+/PTz+8Y8PKysr4eDg4NLHHB0dhR/4gR8IN9xwQ/hf/+t/hd3d3d7bCTE5JwIAgIsJ3QAAVMrgKRBCCO9///vDq1/96nDXXXeFT33qU+HpT396eMELXhD+/d//fer9/+Zv/ia8+MUvDi996UvD3//934fNzc2wubkZ/vEf/3Hgluej7TY+OjoKL37xi8Nf/uVfho9//OPh1ltvDT/xEz8RvvzlLw/c8ry03c4jX/ziF8Ov/uqvhuc+97kDtTRvbbfzww8/HH78x388fPGLXwwf+MAHwmc/+9lw9913hyc84QkDtzwvbbfz+973vvDa17423HXXXeHTn/50eO973xve//73h9e//vUDtzwvDz30UHj6058e3vnOd851/y984Qvhp37qp8Lznve8cP/994df/uVfDi972cvChz/84Z5bCnE4ZwQAgMutNE3TxG4EAABxbG/ux25CsgwwU4tnPetZ4Yd+6IfCO97xjhBCCMfHx+HWW28Nv/RLvxRe+9rXnrv/C1/4wvDQQw+FP//zPz/92Q//8A+HZzzjGeE973nPYO3OSdttPOnKlSvhUY96VHjHO94RXvKSl/Td3Gwtsp2vXLkSfuzHfiz83M/9XPjrv/7r8NWvfnWumS5q1nY7v+c97wm/8zu/Ez7zmc+E66+/fujmZqvtdn7lK18ZPv3pT4ePfvSjpz/7lV/5lfC3f/u34WMf+9hg7c7ZyspK+OAHP3jhjFevec1rwr333nsmaPqiF70ofPWrXw333XffAK1kWc5/5ud8CAAA5mOmGwCAihlIhbo9/PDD4ZOf/GR4/vOff/qz1dXV8PznPz98/OMfn/qYj3/842fuH0IIL3jBC2bev3aLbONJ3/jGN8K3vvWt8J3f+Z19NTN7i27nN7/5zeExj3lMeOlLXzpEM7O3yHY+PDwMz372s8MrXvGKcMstt4TbbrstvPWtbw1XrlwZqtnZWWQ7P+c5zwmf/OQnT5eg+vznPx8+9KEPhZ/8yZ8cpM21cAzMm8DN/JwnAgDA/IRuAAAqZ0AV6vWf//mf4cqVK+GWW2458/NbbrklPPDAA1Mf88ADD7S6f+0W2caTXvOa14THP/7x5wq9XLPIdv7Yxz4W3vve94a77757iCYWYZHt/PnPfz584AMfCFeuXAkf+tCHwp133hne/va3h9/4jd8YoslZWmQ7/8zP/Ex485vfHH70R380XH/99eHJT35yWF9ft7xUx2YdAx988MHwzW9+M1KrAAAAiEnoBgAAABL1tre9Ldxzzz3hgx/8YLjxxhtjN6cY//3f/x22trbC3XffHR796EfHbk7Rjo+Pw2Me85jwh3/4h+GZz3xmeOELXxje8IY3WI6uY0dHR+Gtb31reNe73hU+9alPhT/7sz8L9957b3jLW94Su2mQDBcbzMd2AgCAdtZiNwAAgPj2DrZMtz7GQDO1ePSjHx2uu+668JWvfOXMz7/yla+Exz72sVMf89jHPrbV/Wu3yDYe+d3f/d3wtre9LfzFX/xFeNrTntZnM7PXdjv/8z//c/jiF78Ybr/99tOfHR8fhxBCWFtbC5/97GfDk5/85H4bnaFFPs+Pe9zjwvXXXx+uu+660599//d/f3jggQfCww8/HB7xiEf02uYcLbKd77zzzrC1tRVe9rKXhRBCeOpTnxoeeuih8PM///PhDW94Q1hddd1dF2YdA2+++eZw0003RWoVAAAAMTnjBgAghHA1aCJsAnV5xCMeEZ75zGeGj370o6c/Oz4+Dh/96EfDs5/97KmPefazn33m/iGE8JGPfGTm/Wu3yDYOIYTf/u3fDm95y1vCfffdF37wB39wiKZmre12fspTnhL+4R/+Idx///2n/zY2NsLznve8cP/994dbb711yOZnY5HP84/8yI+Ef/qnfzoNNYUQwuc+97nwuMc9TuBmhkW28ze+8Y1zwZpR0Klpmv4aWxnHwPw537mY7QMAAO0J3QAAcIaBVqjLq1/96nD33XeHvb298OlPfzq8/OUvDw899FD42Z/92RBCCC95yUvC6173utP7v+pVrwr33XdfePvb3x4+85nPhDe96U3hE5/4RHjlK18Z61dIXttt/Fu/9VvhzjvvDH/8x38cnvSkJ4UHHnggPPDAA+HrX/96rF8hC22284033hhuu+22M/++4zu+I3z7t397uO2224RBLtD28/zyl788/Nd//Vd41ateFT73uc+Fe++9N7z1rW8Nr3jFK2L9Cllou51vv/328O53vzvcc8894Qtf+EL4yEc+Eu68885w++23n5lliLO+/vWvnwbvQgjhC1/4Qrj//vvDl770pRBCCK973evCS17yktP7/+Iv/mL4/Oc/H37t134tfOYznwnvete7wp/8yZ+EO+64I0bzAQAASIDlpQAAOKfm5aaEjqjNC1/4wvAf//Ef4dd//dfDAw88EJ7xjGeE++67L9xyyy0hhBC+9KUvnZk94TnPeU543/veF974xjeG17/+9eF7vud7wsHBQbjtttti/QrJa7uN3/3ud4eHH344/PRP//SZ57nrrrvCm970piGbnpW225nFtN3Ot956a/jwhz8c7rjjjvC0pz0tPOEJTwivetWrwmte85pYv0IW2m7nN77xjWFlZSW88Y1vDF/+8pfDd33Xd4Xbb789/OZv/masXyELn/jEJ8Lznve80+9f/epXhxBC2N7eDru7u+Hf/u3fTgM4IYTw3d/93eHee+8Nd9xxR/j93//98MQnPjH80R/9UXjBC14weNsBAABIw0pjjlkAAC5QW/hG6AYAAMpV2/lNG86FAACgPTPdAABwocmB15IHqQ0yAwAAAAAA8zKvMgAAAAAAAAAAtCR0AwAAwSw3AABQA/3+6WwXAABYjOWlAABoZXwwtuSlpgAAAAAAAC5iphsAAAAAAKiYCyoAAGAxQjcAACyslCnIS/k9AACAy+n/AwAAXRG6AQAAAACAypntBgAA2luL3QAAAPI26ypRA7YAAAB5GT+PMyMQAABczkw3AAD0IpcB2lzaCQAAMCQXUgAAwOWEbgAA6M3ewZZQCwAAQIacywEAwOWEbgAA6F2qg7WptgsAAAAAAEif0A0AAINIbdablNoCAAAMy/kAAADQhbXYDQAAoC7jg9vbm/vR2wAAAAAAALAIM90AABBNjNlvBG4AAIAQnBsAAADLE7oBACA6g90AAAAAAEBuhG4AAKiGcA8AADAuxuybAABAOYRuAACogoF0AABgFucLAADAIoRuAABIQp9XmBpABwAAAAAAuiZ0AwBAUroOyAjcAAAA83DuAAAAtLUWuwEAANAHA+YAAACLcT4FAADzEboBAKA4BogBAADacy4FAADtrDRN08RuBAAATNre3F/4sQaKAQCAZS1zTpIb51AAALAYM90AAFAMA8UAAADtOI8CAIDFrcZuAAAAAAAAMDyBGwAAWI7lpQAASFbb6dwNGAMAAF0rbZkp500AANAdM90AAJC10YCxgWMAAKAPzjUAAIBZhG4AAMieQXAAAKBPewdbzjsAAIBz1mI3AAAA5mGAGwAAiG38vCS3ZaecUwEAQPfMdAMAQLIMCgMAAKlyvgIAAJjpBgCA5BnMBgAAUjR5rpLq7DfOqQAAoB9mugEAIGkGhwEAABbnnAoAAPpjphsAAAAAAOjAeMAl1VlvAACA7qw0TdPEbgQAAAAAAJQmVvDG7DYAADAMoRsAAAAAABjAECEcgRsAABjOauwGAAAAAAAAAABAbtZiNwAAAAAAAGoxPhNNrOWnAACAbpjpBgAAAAAABjDE0k+CPAAAMByhGwAAAAAAiGyIQA4AANAty0sBAAAAAEAE04I2o5+ZsQYAANJnphsAAAAAAEhAF7PdmDEHAACGI3QDAAAAAAAAAAAtCd0AAAAAAAAAAEBLQjcAAAAAAJCYvYMtS0UBAEDiVpqmaWI3AgAAAAAAmM/25v6FtwvrAADAMIRuAAAAAAAgQxeFbwRvAACgf2uxGwAAAAAAAHRD2AYAAIazGrsBAAAAAABAO5ctMQUAAPTP8lIAAAAAAJCxUQDHLDcAADAsM90AAAAAAEDmBG4AAGB4ZroBAAAAAAAAAICWzHQDAAAAAAAAAAAtCd0AAAAAAAAAAEBLQjcAAAAAAAAAANCS0A0AAAAAAAAAALQkdAMAAAAAAAAAAC0J3QAAAAAAAAAAQEtCNwAAAAAAAAAA0JLQDQAAAAAAAAAAtCR0AwAAAAAAAAAALf3/AdLN70ahcQ8AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 2249x1024 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "NSDsubj = fMRISubject('subj01','nativesurface', 'betas_fithrf_GLMdenoise_RR')\n",
    "ROI = BrainRegion(NSDsubj, 'OTC',0)\n",
    "ROI.load_betas()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "9e2fe0c6-7620-4a34-acbe-22b297cfe04c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3)\n"
     ]
    }
   ],
   "source": [
    "x = ROI.betas['rh']\n",
    "\n",
    "v = x[:,:,21]\n",
    "print(v.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "9fea67cf-addb-4331-9a3b-dfad251924f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6262443\n",
      "1.0\n",
      "0.37375573266784556\n",
      "0.7725419111363212\n"
     ]
    }
   ],
   "source": [
    "noisevar = np.mean(np.std(v, axis = 1) ** 2)\n",
    "print(noisevar)\n",
    "totalvar = np.std(v.reshape(-1)) ** 2\n",
    "print(totalvar)\n",
    "signalsd = np.sqrt(totalvar - noisevar)\n",
    "print(signalvar)\n",
    "ncsnr = np.sqrt(signalvar) / noisesd\n",
    "print(ncsnr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "3b1224b6-d470-44d3-a162-39fc001e41ce",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([2.660e+02, 7.090e+02, 9.900e+02, 1.166e+03, 1.297e+03, 1.274e+03,\n",
       "        1.025e+03, 8.810e+02, 7.620e+02, 5.040e+02, 3.860e+02, 2.810e+02,\n",
       "        1.730e+02, 1.110e+02, 6.100e+01, 6.000e+01, 1.800e+01, 2.000e+01,\n",
       "        5.000e+00, 7.000e+00, 2.000e+00, 1.000e+00, 0.000e+00, 0.000e+00,\n",
       "        1.000e+00]),\n",
       " array([0.00424638, 0.12150784, 0.2387693 , 0.35603073, 0.4732922 ,\n",
       "        0.59055364, 0.7078151 , 0.8250765 , 0.942338  , 1.0595994 ,\n",
       "        1.1768609 , 1.2941223 , 1.4113837 , 1.5286453 , 1.6459067 ,\n",
       "        1.7631682 , 1.8804296 , 1.997691  , 2.1149526 , 2.232214  ,\n",
       "        2.3494754 , 2.4667368 , 2.5839982 , 2.7012599 , 2.8185213 ,\n",
       "        2.9357827 ], dtype=float32),\n",
       " <BarContainer object of 25 artists>)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(v.reshape(-1),25)\n",
    "plt.hist(np.std(v, axis = 1),25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "id": "97bd8f69-c918-4cc4-aac9-2162b2f793b3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='8' class='' max='8' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [8/8 41:07&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 1064)\n",
      "(30000, 485)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:12&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:05&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 1064)\n",
      "(10000, 3, 485)\n",
      "(30000, 2180)\n",
      "(30000, 1727)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:26&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:21&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 2180)\n",
      "(10000, 3, 1727)\n",
      "(30000, 4721)\n",
      "(30000, 7649)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:57&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 01:35&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 4721)\n",
      "(10000, 3, 7649)\n",
      "(30000, 2809)\n",
      "(30000, 864)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:34&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:10&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 2809)\n",
      "(10000, 3, 864)\n",
      "(30000, 443)\n",
      "(30000, 1084)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:05&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:12&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 443)\n",
      "(10000, 3, 1084)\n",
      "(30000, 1959)\n",
      "(30000, 2467)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:23&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:30&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 1959)\n",
      "(10000, 3, 2467)\n",
      "(30000, 6960)\n",
      "(30000, 8000)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 01:25&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 01:39&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 6960)\n",
      "(10000, 3, 8000)\n",
      "(30000, 876)\n",
      "(30000, 643)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:10&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:07&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 876)\n",
      "(10000, 3, 643)\n",
      "(24000, 785)\n",
      "(24000, 1743)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:07&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 785)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:17&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 1743)\n",
      "(10000, 3, 785)\n",
      "(10000, 3, 1743)\n",
      "(24000, 2471)\n",
      "(24000, 3236)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:24&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 2471)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:32&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 3236)\n",
      "(10000, 3, 2471)\n",
      "(10000, 3, 3236)\n",
      "(24000, 7676)\n",
      "(24000, 7521)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 01:15&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 7676)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 01:13&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 7521)\n",
      "(10000, 3, 7676)\n",
      "(10000, 3, 7521)\n",
      "(24000, 3046)\n",
      "(24000, 998)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:29&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 3046)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:09&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 998)\n",
      "(10000, 3, 3046)\n",
      "(10000, 3, 998)\n",
      "(22500, 1089)\n",
      "(22500, 793)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:09&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 1089)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:07&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 793)\n",
      "(10000, 3, 1089)\n",
      "(10000, 3, 793)\n",
      "(22500, 2115)\n",
      "(22500, 1856)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:19&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 2115)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:17&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 1856)\n",
      "(10000, 3, 2115)\n",
      "(10000, 3, 1856)\n",
      "(22500, 7568)\n",
      "(22500, 8197)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 01:09&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 7568)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 01:15&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 8197)\n",
      "(10000, 3, 7568)\n",
      "(10000, 3, 8197)\n",
      "(22500, 1722)\n",
      "(22500, 1314)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:15&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 1722)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:11&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 1314)\n",
      "(10000, 3, 1722)\n",
      "(10000, 3, 1314)\n",
      "(30000, 531)\n",
      "(30000, 995)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:06&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:11&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 531)\n",
      "(10000, 3, 995)\n",
      "(30000, 2655)\n",
      "(30000, 2482)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:33&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:33&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 2655)\n",
      "(10000, 3, 2482)\n",
      "(30000, 9411)\n",
      "(30000, 10685)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 01:58&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 02:12&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 9411)\n",
      "(10000, 3, 10685)\n",
      "(30000, 1357)\n",
      "(30000, 539)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:16&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:06&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 1357)\n",
      "(10000, 3, 539)\n",
      "(24000, 853)\n",
      "(24000, 387)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:08&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 853)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:03&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 387)\n",
      "(10000, 3, 853)\n",
      "(10000, 3, 387)\n",
      "(24000, 2401)\n",
      "(24000, 2671)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:23&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 2401)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:26&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 2671)\n",
      "(10000, 3, 2401)\n",
      "(10000, 3, 2671)\n",
      "(24000, 7574)\n",
      "(24000, 10066)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 01:23&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 7574)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 01:42&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 10066)\n",
      "(10000, 3, 7574)\n",
      "(10000, 3, 10066)\n",
      "(24000, 944)\n",
      "(24000, 1384)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:09&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 944)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='32' class='' max='32' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [32/32 00:13&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 1384)\n",
      "(10000, 3, 944)\n",
      "(10000, 3, 1384)\n",
      "(30000, 763)\n",
      "(30000, 749)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:11&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:11&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 763)\n",
      "(10000, 3, 749)\n",
      "(30000, 1915)\n",
      "(30000, 2136)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:24&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:27&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 1915)\n",
      "(10000, 3, 2136)\n",
      "(30000, 7385)\n",
      "(30000, 6882)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 01:32&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 01:25&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 7385)\n",
      "(10000, 3, 6882)\n",
      "(30000, 572)\n",
      "(30000, 850)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:06&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='40' class='' max='40' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [40/40 00:10&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 3, 572)\n",
      "(10000, 3, 850)\n",
      "(22500, 1189)\n",
      "(22500, 996)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:10&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 1189)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:09&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 996)\n",
      "(10000, 3, 1189)\n",
      "(10000, 3, 996)\n",
      "(22500, 2195)\n",
      "(22500, 2296)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:20&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 2195)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:21&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 2296)\n",
      "(10000, 3, 2195)\n",
      "(10000, 3, 2296)\n",
      "(22500, 6707)\n",
      "(22500, 6659)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 01:02&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 6707)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 01:00&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 6659)\n",
      "(10000, 3, 6707)\n",
      "(10000, 3, 6659)\n",
      "(22500, 3177)\n",
      "(22500, 1190)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:28&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 3177)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "    /* Turns off some styling */\n",
       "    progress {\n",
       "        /* gets rid of default border in Firefox and Opera. */\n",
       "        border: none;\n",
       "        /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "        background-size: auto;\n",
       "    }\n",
       "    progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
       "        background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
       "    }\n",
       "    .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "        background: #F44336;\n",
       "    }\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      <progress value='30' class='' max='30' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [30/30 00:10&lt;00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30000, 1190)\n",
      "(10000, 3, 3177)\n",
      "(10000, 3, 1190)\n"
     ]
    }
   ],
   "source": [
    "for subj in progress_bar([f'subj0{s}' for s in range(1,9)]):\n",
    "    NSDsubj = fMRISubject(subj,\n",
    "                         'nativesurface',\n",
    "                         'betas_fithrf_GLMdenoise_RR')\n",
    "    \n",
    "    for roi in ['FFA-1','PPA','EBA','VWFA-1']:\n",
    "\n",
    "        ROI = BrainRegion(NSDsubj, roi, 0, plot = False)\n",
    "        ROI.load_betas()\n",
    "    \n",
    "#OTC.load_train_test_data(train_imageset = 'nonshared1000-3rep-batch1', test_imageset = 'special515')\n",
    "#FFA.betas['lh'].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "id": "f3a9c7bc-12bd-4d2a-b755-d86b2040ae38",
   "metadata": {},
   "outputs": [],
   "source": [
    "FFA.get_ncsnr_mask(threshold = 0.3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "id": "aa62380d-d5a7-42b1-8a7a-ba20949ddc18",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1549"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(FFA.mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "6bf5bda2-c08a-46d5-a5f3-3b71517f8305",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10000, 3, 1064)"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#subj01.plot_data(OTC.ncsnr, 'OTC')\n",
    "FFA.betas['lh'].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "b30a8eb6-ff2e-46c1-a7e9-b271edf6ffe5",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = np.load('/home/jovyan/work/DataLocal-w/NSD_processed_data/subj01/nativesurface_FFA-1.npy',allow_pickle=True).item()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "b65aa453-525c-4222-8e36-4d475ad65fe7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10000, 3, 1064)"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.betas['lh'].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7855d6c7-3fcf-4e88-8afb-8653da329327",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7cea2b71-4b01-45e9-83d6-9d1280d4bf2b",
   "metadata": {},
   "outputs": [],
   "source": [
    "class BrainModelComparison:\n",
    "    def __init__(self, brain_region, dnn_model):\n",
    "        self.brain_region = brain_region\n",
    "        self.dnn_model = dnn_model\n",
    "\n",
    "    def classical_rsa(self, layer, unit_subset=None):\n",
    "        # Compute Pearson similarity matrices for brain and model feature spaces\n",
    "        # and correlate them (classical RSA)\n",
    "        pass\n",
    "\n",
    "    def feature_reweighted_rsa(self, layer, unit_subset=None, train_data_loader=None, test_data_loader=None):\n",
    "        # Fit a sparse, positive-weighted encoding model between the model and brain feature spaces\n",
    "        # using a training set of fMRI stimuli (using sklearn.Lasso(positive=True))\n",
    "        # Then, generate predicted voxel activations over a test set of fMRI stimuli\n",
    "        # The model similarity matrix is computed over these predicted activations\n",
    "        # and correlated with the brain similarity matrix (veRSA)\n",
    "        pass\n",
    "\n",
    "    def best_layer_rsa(self, layers, image_set_1, image_set_2, comparison_method=\"classical_rsa\"):\n",
    "        # Use image_set_1 to compute prediction scores for all layers\n",
    "        # Select the best layer\n",
    "        # Report a final score using image_set_2 in just that layer\n",
    "        pass\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0bed4f39-739a-4202-b757-2647c61ea83f",
   "metadata": {},
   "outputs": [],
   "source": [
    "class GSN:\n",
    "    def __init__(self, brain_region, image_set):\n",
    "        self.brain_region = brain_region\n",
    "        self.image_set = image_set\n",
    "\n",
    "    def compute_noise_ceiling(self):\n",
    "        # Run the GSN pipeline to compute a subject-specific noise ceiling\n",
    "        # Return the signal and noise covariance matrices of the brain data\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9717f554-6592-4955-8b75-6a7907d664fc",
   "metadata": {},
   "outputs": [],
   "source": [
    "subjects = []\n",
    "brain_regions = []\n",
    "\n",
    "# Main pipeline\n",
    "def main():\n",
    "    # Load different image sets\n",
    "    localizer_images = ImageSet('localizer', localizer_image_paths)\n",
    "    localizer_images.load_images()\n",
    "    localizer_data_loader = DataLoaderWrapper(localizer_images, dnn_model)\n",
    "\n",
    "    probe_images = ImageSet('probe', probe_image_paths)\n",
    "    probe_images.load_images()\n",
    "\n",
    "    fmri_stimuli = ImageSet('fmri_stimuli', fmri_stimuli_paths)\n",
    "    fmri_stimuli.load_images()\n",
    "\n",
    "    imagenet_train = ImageSet('imagenet_train', imagenet_train_paths)\n",
    "    imagenet_train.load_images()\n",
    "\n",
    "    imagenet_val = ImageSet('imagenet_val', imagenet_val_paths)\n",
    "    imagenet_val.load_images()\n",
    "\n",
    "    # Load DNN model\n",
    "    dnn_model = DNNModel(model_name, model_path, model_type)\n",
    "    dnn_model.load_model()\n",
    "    dnn_model.find_selective_units(localizer_images.images)\n",
    "\n",
    "    if dnn_model.model_type == 'self-supervised':\n",
    "        dnn_model.train_linear_probe(imagenet_train.images, imagenet_val.images)\n",
    "\n",
    "    dnn_model.assess_lesioning_impact(imagenet_val.images)\n",
    "\n",
    "    # Load fMRI subject data and process it\n",
    "    fmri_subject = fMRISubject(subject_id, fmri_data_path)\n",
    "    fmri_subject.load_fmri_data()\n",
    "    fmri_subject.find_brain_regions(fmri_stimuli.images)\n",
    "\n",
    "    # Brain-model comparison\n",
    "    comparison = BrainModelComparison(brain_region, dnn_model)\n",
    "    classical_rsa_score = comparison.classical_rsa(layer)\n",
    "    veRSA_score = comparison.feature_reweighted_rsa(layer, train_data_loader=fmri_train_data_loader, test_data_loader=fmri_test_data_loader)\n",
    "    best_layer_score = comparison.best_layer_rsa(layers, image_set_1, image_set_2)\n",
    "    \n",
    "    # GSN noise ceiling computation\n",
    "    gsn = GSN(brain_region, fmri_stimuli)\n",
    "    noise_ceiling, signal_cov, noise_cov = gsn.compute_noise_ceiling()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "dropout",
   "language": "python",
   "name": "dropout"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
